課程
/移動(dòng)開(kāi)發(fā)
/Android
/Android CMake以及NDK實(shí)踐基礎(chǔ)
怎么創(chuàng)建一個(gè)動(dòng)態(tài)注冊(cè)項(xiàng)目?
2020-04-09
源自:Android CMake以及NDK實(shí)踐基礎(chǔ) 2-2
正在回答
JNIDynamicLoad.java public?class?JNIDynamicLoad?{ ????static?{ ????????System.loadLibrary("dynamic-lib"); ????} ????public?native?int?getRandomNum(); ????public?native?String?getNativeString(); }
jni_dynamic_load.cpp
// //?Created?by?admin?on?2020-04-27. // #include?<jni.h> #include?<cassert> #include?<cstdlib> #include?<iostream> using?namespace?std; jint?get_random_num(JNIEnv?*env)?{ ????return?rand(); } jstring?get_native_string(JNIEnv?*env)?{ ????return?env->NewStringUTF("jni動(dòng)態(tài)加載的字符串,嘿嘿嘿"); } /** ?*?需要注冊(cè)的函數(shù)列表,放在JNINativeMethod類型的數(shù)組中,以后如果需要增加函數(shù),只需在這里添加就行了 ?*?參數(shù): ?*?1、java代碼中用native關(guān)鍵字聲明的函數(shù)名字符串 ?*?2、簽名(傳進(jìn)來(lái)參數(shù)類型和返回值類型的說(shuō)明) ?*?3、C/C++中對(duì)應(yīng)函數(shù)的函數(shù)名(地址) ?*/ static?JNINativeMethod?getMethods[]?=?{ ????????{"getRandomNum",????"()I",??????????????????(void?*)?get_random_num}, ????????{"getNativeString",?"()Ljava/lang/String;",?(void?*)?get_native_string} }; /** ?*?此函數(shù)通過(guò)調(diào)用JNI中?RegisterNatives?方法來(lái)注冊(cè)我們的函數(shù) ?*?@param?env ?*?@param?className ?*?@param?methods ?*?@param?nMethods ?*?@return ?*/ static?int?registerNativeMethods(JNIEnv?*env,?const?char?*className,?const?JNINativeMethod?*methods, ?????????????????????????????????jint?nMethods)?{ ????jclass?clazz; ????//找到聲明native方法的類 ????clazz?=?env->FindClass(className); ????if?(clazz?==?NULL)?{ ????????return?JNI_FALSE; ????} ????if?(env->RegisterNatives(clazz,?methods,?nMethods)?<?0)?{ ????????return?JNI_FALSE; ????} ????return?JNI_TRUE; } static?int?registerNatives(JNIEnv?*env)?{ ????const?char?*className?=?"com/example/jnidemo3/load/JNIDynamicLoad"; ????return?registerNativeMethods(env,?className,?getMethods, ?????????????????????????????????sizeof(getMethods)?/?sizeof(getMethods[0])); } JNIEXPORT?jint?JNICALL?JNI_OnLoad(JavaVM?*vm,?void?*reserved)?{ ????JNIEnv?*env?=?NULL; ????//判斷虛擬機(jī)狀態(tài)是否有問(wèn)題 ????if?(vm->GetEnv((void?**)?&env,?JNI_VERSION_1_6)?!=?JNI_OK)?{ ????????return?-1; ????} ????assert(env?!=?NULL); ????if?(!registerNatives(env))?{ ????????return?-1; ????} ????return?JNI_VERSION_1_6; }
CMakeList.txt
add_library( ????????dynamic-lib ????????SHARED ????????jni/jni_dynamic_load.cpp ) target_link_libraries( ????????dynamic-lib ????????${log-lib})
如果還有疑惑,可以看我練習(xí)的代碼https://github.com/shuiyouwen/JniDemo3
舉報(bào)
Android底層開(kāi)發(fā)入門必備,CMake動(dòng)態(tài)庫(kù)編譯和使用,NDK的各種開(kāi)發(fā)技巧。
1 回答請(qǐng)問(wèn)windows下的jni編譯為dll,如何動(dòng)態(tài)注冊(cè)??
1 回答請(qǐng)問(wèn)windows平臺(tái)下的jni編譯為dll,如何動(dòng)態(tài)注冊(cè)??
1 回答請(qǐng)問(wèn)在項(xiàng)目中jvm.h等怎么寫的
1 回答JNI項(xiàng)目
2 回答*threadCallback 這個(gè)是怎么調(diào)用的呢?
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號(hào)-11 京公網(wǎng)安備11010802030151號(hào)
購(gòu)課補(bǔ)貼聯(lián)系客服咨詢優(yōu)惠詳情
慕課網(wǎng)APP您的移動(dòng)學(xué)習(xí)伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號(hào)
2020-04-29
JNIDynamicLoad.java public?class?JNIDynamicLoad?{ ????static?{ ????????System.loadLibrary("dynamic-lib"); ????} ????public?native?int?getRandomNum(); ????public?native?String?getNativeString(); }jni_dynamic_load.cpp
// //?Created?by?admin?on?2020-04-27. // #include?<jni.h> #include?<cassert> #include?<cstdlib> #include?<iostream> using?namespace?std; jint?get_random_num(JNIEnv?*env)?{ ????return?rand(); } jstring?get_native_string(JNIEnv?*env)?{ ????return?env->NewStringUTF("jni動(dòng)態(tài)加載的字符串,嘿嘿嘿"); } /** ?*?需要注冊(cè)的函數(shù)列表,放在JNINativeMethod類型的數(shù)組中,以后如果需要增加函數(shù),只需在這里添加就行了 ?*?參數(shù): ?*?1、java代碼中用native關(guān)鍵字聲明的函數(shù)名字符串 ?*?2、簽名(傳進(jìn)來(lái)參數(shù)類型和返回值類型的說(shuō)明) ?*?3、C/C++中對(duì)應(yīng)函數(shù)的函數(shù)名(地址) ?*/ static?JNINativeMethod?getMethods[]?=?{ ????????{"getRandomNum",????"()I",??????????????????(void?*)?get_random_num}, ????????{"getNativeString",?"()Ljava/lang/String;",?(void?*)?get_native_string} }; /** ?*?此函數(shù)通過(guò)調(diào)用JNI中?RegisterNatives?方法來(lái)注冊(cè)我們的函數(shù) ?*?@param?env ?*?@param?className ?*?@param?methods ?*?@param?nMethods ?*?@return ?*/ static?int?registerNativeMethods(JNIEnv?*env,?const?char?*className,?const?JNINativeMethod?*methods, ?????????????????????????????????jint?nMethods)?{ ????jclass?clazz; ????//找到聲明native方法的類 ????clazz?=?env->FindClass(className); ????if?(clazz?==?NULL)?{ ????????return?JNI_FALSE; ????} ????if?(env->RegisterNatives(clazz,?methods,?nMethods)?<?0)?{ ????????return?JNI_FALSE; ????} ????return?JNI_TRUE; } static?int?registerNatives(JNIEnv?*env)?{ ????const?char?*className?=?"com/example/jnidemo3/load/JNIDynamicLoad"; ????return?registerNativeMethods(env,?className,?getMethods, ?????????????????????????????????sizeof(getMethods)?/?sizeof(getMethods[0])); } JNIEXPORT?jint?JNICALL?JNI_OnLoad(JavaVM?*vm,?void?*reserved)?{ ????JNIEnv?*env?=?NULL; ????//判斷虛擬機(jī)狀態(tài)是否有問(wèn)題 ????if?(vm->GetEnv((void?**)?&env,?JNI_VERSION_1_6)?!=?JNI_OK)?{ ????????return?-1; ????} ????assert(env?!=?NULL); ????if?(!registerNatives(env))?{ ????????return?-1; ????} ????return?JNI_VERSION_1_6; }CMakeList.txt
add_library( ????????dynamic-lib ????????SHARED ????????jni/jni_dynamic_load.cpp ) target_link_libraries( ????????dynamic-lib ????????${log-lib})如果還有疑惑,可以看我練習(xí)的代碼
https://github.com/shuiyouwen/JniDemo3