android jni 的编写二 (NDK 开发中动态注册Jni)

原创 2016年08月31日 12:12:12
NDK 开发中动态注册Jni.在framework开发中经常见到的是动态注册,但是这需要android的一些特定的api.最近看了一些jin文章觉得也可以NDK也支持动态注册。首先看一下头文件,在NDK中有jni.h参看jni.h 在后边有这两个函数,说明NDK是支持动态注册的。

点击(此处)折叠或打开

  1. /*
  2. * Prototypes for functions exported by loadable shared libs. These are
  3. * called by JNI, not provided by JNI.
  4. */
  5. JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved);
  6. JNIEXPORT void JNI_OnUnload(JavaVM* vm, void* reserved);

而我们经常使用的另外一个头文件JNIHelp.h 在dalvik/libnativehelper 目录下,这个是android针对jni的一些封装。
development/samples/SimpleJNI给我们提供了一个例子,在这个例子中告诉我们动态注册的函数是怎样实现的。这就替换掉了
AndroidRuntime::registerNativeMethods(env,"sunniwell/stb/NetWorkNative", gMethods, NELEM(gMethods));


点击(此处)折叠或打开

  1. /*
  2. * Register several native methods for one class.
  3. */
  4. static int registerNativeMethods(JNIEnv* env, const char* className,
  5.     JNINativeMethod* gMethods, int numMethods)
  6. {
  7.     jclass clazz;

  8.     clazz = env->FindClass(className);
  9.     if (clazz == NULL) {
  10.         LOGE("Native registration unable to find class '%s'", className);
  11.         return JNI_FALSE;
  12.     }
  13.     if (env->RegisterNatives(clazz, gMethods, numMethods) < 0) {
  14.         LOGE("RegisterNatives failed for '%s'", className);
  15.         return JNI_FALSE;
  16.     }

  17.     return JNI_TRUE;
  18. }

  19. /*
  20. * Register native methods for all classes we know about.
  21. *
  22. * returns JNI_TRUE on success.
  23. */
  24. static int registerNatives(JNIEnv* env)
  25. {
  26.   if (!registerNativeMethods(env, classPathName,
  27.                  methods, sizeof(methods) / sizeof(methods[0]))) {
  28.     return JNI_FALSE;
  29.   }

  30.   return JNI_TRUE;
  31. }

另外就是一些C++对象的处理。在framework中类一般要继承Ref 类,实现对象的自动管理。在Ndk 中要使用C++ 标准的new delect 。
另外一些就是java异常的处理要使用jni.h 中提供的api 
版权声明:本文为博主原创文章,转载请注明出处。

NDK开发 从入门到放弃(二:动态注册JNI、多JNI调用)

动态注册JNI、多JNI调用
  • xiaoyu_93
  • xiaoyu_93
  • 2016年10月25日 17:01
  • 2392

android NDK开发 静态/动态注册 jni

关于jni有两种方法注册  分别为 静态注册和动态注册 首先 来看看静态注册  所谓的静态注册 就是直接在Java文件里写个native方法 然后再c/c++文件中实现这个方法就行了! 来看看代码...
  • xielinhua88
  • xielinhua88
  • 2016年06月29日 18:31
  • 1132

Android Studio NDK 入门教程(8)--JNI动态注册本地方法

这里可以提供另外一种方法来动态注册c++函数,让其根Java中的native方法关联起来。...
  • venusic
  • venusic
  • 2016年09月09日 15:20
  • 1857

JNI/NDK开发指南(开山篇)

转载请注明出处:         相信很多做过Java或Android开发的朋友经常会接触到JNI方面的技术,由其做过Android的朋友,为了应用的安全性,会将一些复杂的逻辑和算法通过本地代码(C...
  • xyang81
  • xyang81
  • 2014年12月05日 23:41
  • 18637

Android 动态注册JNI函数

1.JNI函数注册方式 在Android开发中,由于种种原因我们需要调用C/C++代码,在这个时候我们就需要使用jni了, jni在使用时要对定义的函数进行注册,这样java才能通过native关...
  • u010925331
  • u010925331
  • 2016年03月27日 16:50
  • 1717

Android JNI 动态注册方法(JNI_OnLoad)

传统的关于android使用JNI调用C/C++程序,首先javah 生产头文件,然后拷贝头文件里面的方法到C文件中进行映射调用,由于这种方法生成的映射方法名不太规则也比较长,二呢是调用数据较慢;因此...
  • leifengpeng
  • leifengpeng
  • 2016年09月06日 10:44
  • 3224

NDK-JNI实战教程(一) 在Android Studio运行第一个NDK程序

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN。因为CSDN也支持MarkDown语法了,牛逼啊!NDK开发,其实是为了项目需要调用底层的一些C/C++的一些东西;另...
  • yanbober
  • yanbober
  • 2015年04月27日 13:23
  • 89315

Android jni/ndk编程一:jni初级认识与实战体验

Android平台很多地方都可以看到jni的身影,比如之前接触到一个投屏的项目,主要的代码是c/c++写的,然后通过Jni供java层调用;另外,就拿Android系统中的Service来说,很多的S...
  • u011913612
  • u011913612
  • 2016年09月19日 18:53
  • 1941

Android JNI/NDK开发(一)NDK真的很难吗?

1. Native (Android层面开发) 2. JNI(Android和C/C++连接层处理) 3. C/C++(逻辑处理层) Android JNI/NDK开发真的很难吗?不不不,三步快...
  • u014702653
  • u014702653
  • 2016年07月08日 14:57
  • 2355

安卓实战开发之JNI从小白到伪老白深入了解JNI动态注册native方法及JNI数据使用

前言或许你知道了jni的简单调用,其实不算什么百度谷歌一大把,虽然这些jni绝大多数情况下都不会让我们安卓工程师来弄,毕竟还是有点难,但是我们还是得打破砂锅知道为什么这样干吧,至少也让我们知道调用流程...
  • u013278099
  • u013278099
  • 2016年07月23日 19:06
  • 3761
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android jni 的编写二 (NDK 开发中动态注册Jni)
举报原因:
原因补充:

(最多只允许输入30个字)