jni 的调用分几种方式:
1。静态调用
2。动态调用
动态调用就是,平时说的,在项目中新建jni目标,用NDK方法来编译。最终生成so文件借当前项目需要的时候,调用
静态调用就是开机的时候加载到虚拟机里面的方式,这里也分两种方式,
1。同样Simplejni 路径:/rowboat-android/development/samples/SimpleJNI
从这个例子可以看出,这种方式调用是,采用封装好的形式,加载到虚拟机里面去,然后调用的方式也区别于ndk,因为方法名前面不用加包名
2。另外一个是把.cpp文件放在framework下面,来保证开机加载到虚拟机里面去,文件存放目录为:rowboat-android/frameworks/base/core/jni
在这个目录下面也有类似的例子,如:
android_os_Power.cpp
static void releaseWakeLock(JNIEnv *env, jobject clazz, jstring idObj)
{
if (idObj == NULL) {
throw_NullPointerException(env, "id is null");
return ;
}
const char *id = env->GetStringUTFChars(idObj, NULL);
release_wake_lock(id);
env->ReleaseStringUTFChars(idObj, id);
}
把定义的方法加载到方法列表当中
static JNINativeMethod method_table[] = {
{ "acquireWakeLock", "(ILjava/lang/String;)V", (void*)acquireWakeLock },
{ "releaseWakeLock", "(Ljava/lang/String;)V", (void*)releaseWakeLock },
{ "setLastUserActivityTimeout", "(J)I", (void*)setLastUserActivityTimeout },
{ "setScreenState", "(Z)I", (void*)setScreenState },
{ "shutdown", "()V", (void*)android_os_Power_shutdown },
{ "rebootNative", "(Ljava/lang/String;)V", (void*)android_os_Power_reboot },
{ "VirtualKey", "()V", (void*)android_os_Power_VirtualKey },
{ "sendKye", "()V", (void*)android_os_Power_sendKey },
};
//注册所有方法到虚拟机
int register_android_os_Power(JNIEnv *env)
{
return AndroidRuntime::registerNativeMethods(
env, "android/os/Power",
method_table, NELEM(method_table));
}
//AndroidRuntime.cpp
extern int register_android_os_Power(JNIEnv *env);
REG_JNI(register_android_os_Power),
在这里增加到总的虚拟机上面,方便统一加载
在这个文件当中完成统一的开机,虚拟机统一加载 。。。。。。
如果 是这种方式调用,那么在程序当中只要直接调用方法名就行了,不需要像NDK 那样System.loadLibrary("demo");
1。静态调用
2。动态调用
动态调用就是,平时说的,在项目中新建jni目标,用NDK方法来编译。最终生成so文件借当前项目需要的时候,调用
静态调用就是开机的时候加载到虚拟机里面的方式,这里也分两种方式,
1。同样Simplejni 路径:/rowboat-android/development/samples/SimpleJNI
从这个例子可以看出,这种方式调用是,采用封装好的形式,加载到虚拟机里面去,然后调用的方式也区别于ndk,因为方法名前面不用加包名
2。另外一个是把.cpp文件放在framework下面,来保证开机加载到虚拟机里面去,文件存放目录为:rowboat-android/frameworks/base/core/jni
在这个目录下面也有类似的例子,如:
android_os_Power.cpp
static void releaseWakeLock(JNIEnv *env, jobject clazz, jstring idObj)
{
if (idObj == NULL) {
throw_NullPointerException(env, "id is null");
return ;
}
const char *id = env->GetStringUTFChars(idObj, NULL);
release_wake_lock(id);
env->ReleaseStringUTFChars(idObj, id);
}
把定义的方法加载到方法列表当中
static JNINativeMethod method_table[] = {
{ "acquireWakeLock", "(ILjava/lang/String;)V", (void*)acquireWakeLock },
{ "releaseWakeLock", "(Ljava/lang/String;)V", (void*)releaseWakeLock },
{ "setLastUserActivityTimeout", "(J)I", (void*)setLastUserActivityTimeout },
{ "setScreenState", "(Z)I", (void*)setScreenState },
{ "shutdown", "()V", (void*)android_os_Power_shutdown },
{ "rebootNative", "(Ljava/lang/String;)V", (void*)android_os_Power_reboot },
{ "VirtualKey", "()V", (void*)android_os_Power_VirtualKey },
{ "sendKye", "()V", (void*)android_os_Power_sendKey },
};
//注册所有方法到虚拟机
int register_android_os_Power(JNIEnv *env)
{
return AndroidRuntime::registerNativeMethods(
env, "android/os/Power",
method_table, NELEM(method_table));
}
//AndroidRuntime.cpp
extern int register_android_os_Power(JNIEnv *env);
REG_JNI(register_android_os_Power),
在这里增加到总的虚拟机上面,方便统一加载
在这个文件当中完成统一的开机,虚拟机统一加载 。。。。。。
如果 是这种方式调用,那么在程序当中只要直接调用方法名就行了,不需要像NDK 那样System.loadLibrary("demo");