资讯专栏INFORMATION COLUMN

JAVA JNI 动态注册

yunhao / 2696人阅读

摘要:前面看到使用方法它有如下几个弊端需要为每个方法的类使用生成一个头文件生成的头文件名太长初次使用函数时需寻找层函数来建立关联,影响性能动态注册动态注册的过程主要是在时会调用函数,在里面我们调用来实行注册。

前面看到使用static natvie方法,它有如下几个弊端:

需要为每个static natvie方法的java类使用javah生成一个头文件

javah生成的头文件名太长

初次使用native函数时需寻找JNI层函数来建立关联,影响性能

动态注册

动态注册的过程主要是在System.loadLibrary()时会调用JNI_OnLoad()函数,在里面我们调用Env->RegisterNatives来实行注册。

例如如下的例子:

创建一个native类

新建一个Android空白工程,在MainActivity.java中的onCreate 中添加:

</>复制代码

  1. NativeClass testClass = new NativeClass();
  2. setTitle("Native Class"+testClass.getStr()+String.valueOf(testClass.getAdd(1, 5)));

NativeClass.java :

</>复制代码

  1. package com.example.testdr;
  2. public class NativeClass {
  3. static {
  4. System.loadLibrary("cpplib");
  5. }
  6. public int getAdd(int a, int b) {
  7. return nativeGetAdd(a, b);
  8. }
  9. public String getStr() {
  10. return "Title:";
  11. }
  12. private native int nativeGetAdd(int a, int b);
  13. }
创建c++ native实现

创建Android.mk文件(略)

main.c

</>复制代码

  1. #include
  2. #include
  3. #include
  4. jint getAdd(JNIEnv* env, jobject obj, jint a, jint b)
  5. {
  6. return (a + b);
  7. }
  8. static JNINativeMethod g_NativeMethods[] = {
  9. {"nativeGetAdd", "(II)I", (void*)getAdd},
  10. };
  11. static const char* classPathName = "com/example/testdr/NativeClass";
  12. jint JNI_OnLoad(JavaVM* vm, void* reserved)
  13. {
  14. JNIEnv *env = NULL;
  15. if ((*vm)->GetEnv(vm, (void**)&env, JNI_VERSION_1_4) != JNI_OK) {
  16. return JNI_ERR;
  17. }
  18. jclass clazz = (*env)->FindClass(env, classPathName);
  19. if (clazz == NULL) {
  20. return JNI_ERR;
  21. }
  22. assert(env != NULL);
  23. if ((*env)->RegisterNatives(env, clazz, g_NativeMethods, 1) < 0) {
  24. return JNI_ERR;
  25. }
  26. return JNI_VERSION_1_4;
  27. }

这里注意c和c++的不同,如果用c++,以上如下:

</>复制代码

  1. vm->GetEnv((void**)&env, JNI_VERSION_1_4)
  2. jclass clazz = env->FindClass(classPathName);
  3. env->RegisterNatives(clazz, g_NativeMethods, 1)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65425.html

相关文章

  • Mac OS上编译JNI动态

    摘要:在中加载的类库注意的动态库在上面的命名是文件,而在上面的命名是类库的名字需要加上也就是在上面动态库的名称应该是生成通过命令生成文件这样就可以生成了一个的文件。在中他所在的位置是使用编译就可以得到一个编译好的文件下面需要把文件打包成动态库。 JNI是Java Native Interface的缩写,是为了在Java上能够调用本地语言尤其是C和c++设计的。 下面就看下如何在Mac OS上...

    付伦 评论0 收藏0
  • java JNI简介

    摘要:的接口函数和指针代码想要访问虚拟机需要调用方法,而获取方法则通过。 JNI的接口函数和指针 native代码想要访问 java虚拟机需要调用JNI方法,而获取JNI方法则通过 JNI interface Pointer。它实际指向的就是一个都是指针的数组,每个指针指向的都是一个接口函数 showImg(https://segmentfault.com/img/bVbdM7A?w=150...

    NicolasHe 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<