Chinaunix首页 | 论坛 | 博客
  • 博客访问: 180662
  • 博文数量: 63
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 69
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-18 13:11
文章分类
文章存档

2013年(64)

我的朋友

分类: LINUX

2013-04-11 12:10:06

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 
阅读(1311) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~