JNI 库的调用流程:
Java System.LoadLibrary("help");
JNI libhelp_jni.so
Dalvik libhelp.so
静态注册
Java com/example/Help.java
CPP Java_com_example_Help.cpp
namespace android {
int register_android_server_HelpService(JNIEnv *env);
}; // 定义注册函数
using namespace android;
extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved){
register_android_server_HelpService(env); // 在具体实现的文件中
}
frameworks/base/services/jni/com_example_Help.cpp
namespace android{
static const JNINativeMethod gMethods[]={
{"help","()V",(void*)MyHelp}
};/*JNI方法表*/
int register_android_server_HelpService(JNIEnv *env){
}
Java System.LoadLibrary("help");
JNI libhelp_jni.so
Dalvik libhelp.so
静态注册
Java com/example/Help.java
CPP Java_com_example_Help.cpp
动态注册
Java层 :
frameworks/base/services/java/com/example/Help.javaprivate static native void help();
JNI层 :
frameworks/base/services/jni/Android.mkLOCAL_SRC_FILES:= \ com_example_Help.cpp
\ onload.cpp
\...
frameworks/base/services/jni/onload.cpp // 编译系统会使用namespace android {
int register_android_server_HelpService(JNIEnv *env);
}; // 定义注册函数
using namespace android;
extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved){
register_android_server_HelpService(env); // 在具体实现的文件中
}
frameworks/base/services/jni/com_example_Help.cpp
namespace android{
static const JNINativeMethod gMethods[]={
{"help","()V",(void*)MyHelp}
};/*JNI方法表*/
int register_android_server_HelpService(JNIEnv *env){
return jniRegisterNativeMethods(env,"com/example/Help",gMethods,NELEM(gMethods));
// 第二个参数是Java层的路径+ClassName
} /*注册JNI方法*/void Myhelp(){
// 具体实现
}}