紫诺不离 发表于 2020-7-1 10:26

jni静态注册和动态注册

首先放上官网链接: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++项目中也可以直接查看

hostwj 发表于 2020-7-1 12:06

感谢分享

topckey 发表于 2020-7-2 23:42

感谢有您~

pantherTL 发表于 2020-7-4 18:00

感谢分享,楼主太厉害了!

straychild 发表于 2020-7-23 20:45

所以说要先练好内功

fcguo800 发表于 2020-7-27 15:35

厉害感谢楼主分享,好好学习一下。

mudcastles 发表于 2020-7-27 15:42

想学习Android JNI知识,还是要去Android Developer学习。
页: [1]
查看完整版本: jni静态注册和动态注册