代码改变世界

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)