<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } -->
-
声明JNI 方法
声明如 private native String printStr();
-
动态库的载入
static {
System.loadLibrary("helloworld"); }
-
调用native 方法
printStr(); 与普通方法相同
-
C 语言实现共享库
-
利用javah 工具生成JNI 接口的头文件
比如在bin (利用eclipse 工具进行app 开发)目录下执行:
javah com.simon.HelloWorld
-
C 的接口实现
实现printStr(), 以及 JNI_OnLoad() 方法
-
编写makefile 文件
LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES:=com_simon_Helloworld.c LOCAL_C_INCLUDES := $(JNI_H_INCLUDE) LOCAL_MODULE := libhelloworld LOCAL_SHARED_LIBRARIES := libutils LOCAL_PRELINK_MODULE := false include $(BUILD_SHARED_LIBRARY)
-
利用c++ 实现共享库
(1 )实现声明的方法
(2 )java 和c ++方法名字的映射
(3 )native 方法的注册
(4 ) C++ 实现的代码如下
#include <jni.h> #define LOG_TAG "HelloWorld" #include <utils/Log.h> /* Native interface, it will be called in java code */ JNIEXPORT jstring JNICALL Java_com_ar_JNIStudy_printJNI(JNIEnv *env, jobject obj) { LOGI("Hello World From libhelloworld.so!"); return env->NewStringUTF("Hello World!"); } static const char *classPathName = "com/ar/JNIStudy"; static JNINativeMethod methods[] = { {"printJNI", "()Ljava/lang/String;", (void*)Java_com_ar_JNIStudy_printJNI }, }; /* * Register several native methods for one class. */ static int registerNativeMethods(JNIEnv* env, const char* className, JNINativeMethod* gMethods, int numMethods) { jclass clazz; clazz = env->FindClass(className); if (clazz == NULL) { LOGE("Native registration unable to find class '%s'", className); return JNI_FALSE; } if (env->RegisterNatives(clazz, gMethods, numMethods) < 0) { LOGE("RegisterNatives failed for '%s'", className); return JNI_FALSE; } return JNI_TRUE; } /* * Register native methods for all classes we know about. * * returns JNI_TRUE on success. */ static int registerNatives(JNIEnv* env) { if (!registerNativeMethods(env, classPathName, methods, sizeof(methods) / sizeof(methods[0]))) { return JNI_FALSE; } return JNI_TRUE; } /* This function will be call when the library first be loaded */ jint JNI_OnLoad(JavaVM* vm, void* reserved) { JNIEnv* env = NULL; LOGI("JNI_OnLoad2!"); if (vm->GetEnv((void**)&env, JNI_VERSION_1_4) != JNI_OK) { LOGE("ERROR: GetEnv failed"); return -1; } if (registerNatives(env) != JNI_TRUE) { LOGE("ERROR: registerNatives failed"); return -1; } LOGI("JNI_OnLoad register OK"); return JNI_VERSION_1_4; }
What Next?
-
-
JNI 的进一步学习, 如native method 中的参数的含义,如何从native method 调用Java mthod 等
-
标准JNI 的学习, 可以参考book
The Java™ Native Interface --------Programmer’s Guide and Specification
-