Android NDK 学习之动态注册
2014-12-03 11:17 雪夜&流星 阅读(567) 评论(0) 收藏 举报关于JNI调用流程可以参考http://blog.csdn.net/conowen/article/details/7521340。
Dalvik虚拟机成功加载库之后,就会自动地寻找库里面的JNI_OnLoad函数,这时候我们需要在JNI_OnLoad函数里绑定注册的native方法。
#include "logger.h" #ifndef NULL #define NULL ((void *) 0) #endif /** * 获取数组的大小 */ #define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0]))) /** * 指定要注册的类,对应的完整的java类名 */ #define JNIREG_CLASS "com/clarck/jni/MainActivity" /** * 返回字符串 */ JNIEXPORT jstring JNICALL native_getLine(JNIEnv *env, jobject obj) { return (*env)->NewStringUTF(env, "Hello World!"); } /** * Java和JNI函数绑定 */ static JNINativeMethod method_table[] = { { "getLine", "()Ljava/lang/String;", (void*)native_getLine }, }; /** * 注册native方法到java中 */ static int registerNativeMethods(JNIEnv* env, const char* className, JNINativeMethod* gMethods, int numMethods) { jclass clazz; clazz = (*env)->FindClass(env, className); if (clazz == NULL) { return JNI_FALSE; } if ((*env)->RegisterNatives(env, clazz, gMethods, numMethods) < 0) { return JNI_FALSE; } return JNI_TRUE; } /** * 调用注册方法 */ int register_ndk_load(JNIEnv* env) { return registerNativeMethods(env, JNIREG_CLASS, method_table, NELEM(method_table)); } JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) { JNIEnv* env = NULL; jint result = -1; if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4) != JNI_OK) { return result; } register_ndk_load(env); //返回jni的版本 return JNI_VERSION_1_4; }
对应的Android.mk,如下:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := prompt_jni LOCAL_SRC_FILES := prompt_jni.c LOCAL_LDLIBS := -llog include $(BUILD_SHARED_LIBRARY)
浙公网安备 33010602011771号