NDK開發(fā)(七)--靜態(tài)注冊和動態(tài)注冊

簡介

在開發(fā)NDK 工程的時候,我們在java層調(diào)用一個native方法的時候,虛擬機(jī)怎樣知道應(yīng)該調(diào)用到so里面的哪個方法呢?這里就用到了另外一個概念注冊,通過注冊,可以將指定的native方法和so里面對應(yīng)的方法綁定起來。注冊分為靜態(tài)注冊動態(tài)注冊。一般我們用到的都是靜態(tài)注冊。

靜態(tài)注冊

通過JNIEXPORT和JNICALL這兩個宏進(jìn)行定義聲明,在虛擬機(jī)加載so的時候,跟根據(jù)定義的函數(shù)找到對應(yīng)的native方法。

extern "C" JNIEXPORT jstring JNICALL
Java_com_canter_ndkdemo4_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    nullPointCrash();
    return env->NewStringUTF(hello.c_str());
}

譬如上面的例子,因?yàn)楹瘮?shù)的定義,是根據(jù)對應(yīng)的native方法的類路徑和類名來生成的,所以能夠直接映射找到對應(yīng)的native方法。

動態(tài)注冊

通過 registerNatives 方法手動完成 native 方法和 so 中的方法的綁定,這樣虛擬機(jī)就可以通過這個函數(shù)映射表直接找到相應(yīng)的方法。
動態(tài)注冊好處是不需要寫很長的方法名,用jni_onload方法實(shí)現(xiàn)預(yù)注冊 即當(dāng)執(zhí)行system.loadLibrary()方法時候就把需要調(diào)用的方法給注冊了,運(yùn)行效率上會比較高。
注冊步驟:

  • 重寫JNI_OnLoad方法;
  • 注冊Java端的方法 以及本地相對應(yīng)的方法
  • 注冊相應(yīng)的類以及方法
  • 聲明并實(shí)現(xiàn)對應(yīng)的c層對應(yīng)的方法

具體代碼如下

//替換java端的testVoid
void native_void() {
LOGV("調(diào)用了native_void,是java 層對應(yīng)的testVoid方法");
}

//替換java端的testInt
int native_testInt() {
return 200;
}

//注冊Java端的方法  以及本地相對應(yīng)的方法
JNINativeMethod method[] = {{"testVoid", "()V", (void *) native_void},
                        {"testInt",  "()I", (int *) native_testInt}};

//注冊相應(yīng)的類以及方法
jint registerNativeMeth(JNIEnv *env) {
jclass cl = env->FindClass("com/canter/ndkdemo5/MainActivity");
if ((env->RegisterNatives(cl, method, sizeof(method) / sizeof(method[0]))) < 0) {
    return -1;
}
return 0;
}

//實(shí)現(xiàn)jni_onload 動態(tài)注冊方法
jint JNI_OnLoad(JavaVM *vm, void *reserved) {
JNIEnv *env = NULL;
if (vm->GetEnv((void **) &env, JNI_VERSION_1_4) != JNI_OK) {
    return -1;
}
if (registerNativeMeth(env) != JNI_OK) {//注冊方法
    return -1;
}
return JNI_VERSION_1_4;//必須返回這個值
}

源碼詳見 github里面的NDKDemo5

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容