android jni调用心得

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");

猜你喜欢

转载自zhaweijin.iteye.com/blog/1698330
今日推荐