NDK 重拾一下

2016-12-18  本文已影响296人  卖梦想的男孩

周末帮小弟弟看一个NDK的问题,回首又温习了一下NDK的部分知识,留个笔头。

1.新版AS中NDK 简单使用

#include <jni.h>
#include <string>
extern "C"
jstring
Java_cn_kerison_demo_ndk_MainActivity_stringFromJNI(        JNIEnv *env,        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}
extern "C"
jstring
Java_cn_kerison_demo_ndk_MainActivity_getPackageName(        JNIEnv *env,        jobject _this,       jobject context) {
    jclass contextClass = env->FindClass("android/content/Context");
    jmethodID methodID = env->GetMethodID(contextClass,"getPackageName","()Ljava/lang/String;");
    jstring result = (jstring) env->CallObjectMethod(context, methodID);
  const char *chars = env->GetStringUTFChars(result, false);
if (chars != NULL) {
    env->ReleaseStringUTFChars(result, chars);
    return env->NewStringUTF(chars);
}
return NULL;
}

MainActivity.java

public class MainActivity extends AppCompatActivity {
    static {
        //加载库文件
        System.loadLibrary("native-lib");   
 }   
 @Override    
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); 
       TextView tv = (TextView) findViewById(R.id.sample_text); 
        //调用native方法
       tv.setText(String.format("%s [%s]",stringFromJNI(),getString(this)));    
}
//声明native方法
public native String stringFromJNI();
 public native String getString(Context context);
}

2.NDK 编译方式

#调用宏my-dir切换到当前工程目录
LOCAL_PATH := $(call my-dir) 
# 清除除了LOCAL_PATH以外的LOCAL_XXX临时变量
include $(CLEAR_VARS) 
#编译生成的文件的类库叫什么名字
 LOCAL_MODULE := hello 
#要编译的c文件
LOCAL_SRC_FILES := Hello.c 
#编译的架构类型
TARGET_ARCH_ABI := All
#编译库的类型脚本
include $(BUILD_SHARED_LIBRARY)
#设置CMake 的版本要求
cmake_minimum_required(VERSION 3.4.1)
#设置编译的库
add_library(
 #设置库名 
native-lib  
#设置库的类型 
SHARED
#设置库需要编译的文件
src/main/cpp/native-lib.cpp )
# 指定库的头文件目录
include_directories(src/main/cpp/include/)
#检查依赖的库
find_library(
#库的路径
log-lib
#库的名字
 log )
#链接第三方库到目标库中
target_link_libraries(
#要链接库的名字
# native-lib
#链接的库
${log-lib} )

3.编译脚本指定

android {
  ...  
defaultConfig {
 ...    
externalNativeBuild {
    //指定编译类型
      cmake {...} 
     // or ndkBuild {...}
    }   
 ndk {
      //指明apk需要打包的架构类型
     abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a','arm64-v8a'   
 }
  }  
buildTypes {...}
externalNativeBuild {
    cmake {   
      path "CMakeLists.txt"
    }
  // or ndkBuild {...}
 }
}

4.NDK注意事项

static {    
System.loadLibrary(“native-lib”);
}
Java 类型 类型签名
boolean Z
byte B
char C
short S
int I
long L
float F
double D
Class (L+类的全路径+;),L是前缀,;是结束符,.用/代替,比如String, 其签名为Ljava/lang/util/String;
Array [类型签名, 比如 [B
java jni
char jchar
byte jbyte
short jshort
int jint
long jlong
float jfloat
double jdouble
boolean jboolean
上一篇 下一篇

猜你喜欢

热点阅读