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

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 

你可能感兴趣的:(android,Android平台)