1.版本声明
androidStudio4.2.1
2.新建一个Native C++ 项目
3.静态注册:打开MainActivity可以看到有一个native声明的方法,对应的native-lib.cpp文件的方法:Java_全类名_方法名,这个默认就是JNI的静态注册。
4.动态注册:重写jni.h头文件中的JNI_OnLoad方法,这个方法会在动态链接库加载时自动调用
//动态注册
static JNINativeMethod methods[] = {
{"stringFromJNI", "()Ljava/lang/String;", reinterpret_cast<void *>(getStr)}
};
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) {
JNIEnv *env = nullptr;
vm->GetEnv(reinterpret_cast<void **>(&env), JNI_VERSION_1_6);
jclass mainActivity = env->FindClass("com/example/myapplication/MainActivity");
env->RegisterNatives(mainActivity, reinterpret_cast<const JNINativeMethod *>(&methods),
sizeof(methods) / sizeof(methods[0]));
return JNI_VERSION_1_6;
}
主要用到的api:
4.1 jint GetEnv(void** env, jint version)
vm->GetEnv:通过JavaVM实例初始化JNIEnv实例,后续的操作都由JNIEnv实例来完成
4.2 jclass FindClass(const char* name)
env->FindClass:通过Java的全类名获取jclass对象
4.3 jint RegisterNatives(jclass clazz, const JNINativeMethod* methods,jint nMethods)
env->RegisterNatives:JNI动态注册核心api,调用此方法即可完成JNI的动态注册。可传入一个数组,并设置nMethods的值,指明需要注册的方法的数量
4.4关于动态注册的参数JNINativeMethod说明
typedef struct {
const char* name;
const char* signature;
void* fnPtr;
} JNINativeMethod;
结构体name属性为Java类中native修饰方法的方法名
结构体signature属性为Java类中native修饰方法的方法签名,可通过javap -s 查看编译好的calss文件获得
结构体signature属性为C++文件中需要跟Java绑定的函数名称,C++函数定义需包含两个固定参数functionName(JNIEnv *env, jobject object)