首先放上官网链接:https://developer.android.com/training/articles/perf-jni
如果您想在加载类时缓存方法 ID,并在取消加载类后重新加载时自动重新缓存方法 ID,那么初始化方法 ID 的正确做法是,将与以下类似的一段代码添加到相应类中:
java代码:
private static native void nativeInit();
//这个静态代码块是只初始化一次,提高运行效率
static {
nativeInit();
}
kotlin代码
private external fun nativeInit()
init {
nativeInit()
}
}
静态初始化程序应如下所示:
java代码
static {
System.loadLibrary("fubar");
}
kotlin代码
companion object {
init {
System.loadLibrary("fubar")
}
}
静态注册
进入到工程的src/main/java目录中
执行javah -jni com.example.myapplication.MainActivity(需要java配置好环境,com.example.myapplication.MainActivity是我java加载so的java路径)
此时会生成函数的声明,实现一下即可
动态注册
-
提供 JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) 函数。
-
在 JNI_OnLoad 中,使用 RegisterNatives 注册所有原生方法。
c++代码(c用到的函数名和c++是一样的,只是参数不同):
JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) {
JNIEnv* env;
//获取env
if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
return JNI_ERR;
}
//获取class
jclass c = env->FindClass("com/example/app/package/MyClass");
if (c == nullptr) return JNI_ERR;
// 方法结构体数组
static const JNINativeMethod methods[] = {
{"nativeFoo", "()V", reinterpret_cast(nativeFoo)},
{"nativeBar", "(Ljava/lang/String;I)Z", reinterpret_cast(nativeBar)},
};
//注册原生方法
int rc = env->RegisterNatives(c, methods, sizeof(methods)/sizeof(JNINativeMethod));
if (rc != JNI_OK) return rc;
return JNI_VERSION_1_6;
}
为什么要学习jni呢?
知道原理才能更好的去破解,不然就只能靠猜,或者一味的跟别人的教程走,没有了教程和工具就什么都不会了。同样现在很多项目都是kotlin写的,你用java的办法去搜肯定没用了。
最后附上jni.h文件,里面有详细的jni所有的方法定义和宏。在android studio的c\c++项目中也可以直接查看
jni.7z
(7.1 KB, 下载次数: 22)
|