安卓逆向_15( 三 ) --- Android NDK 开发【 jni 静态注册、JNI_OnLoad 动态注册】
?
?
Android Studio開發JNI示例:https://blog.csdn.net/wzhseu/article/details/79683045
JNI_動態注冊_靜態注冊.zip :?https://pan.baidu.com/s/1wpTYA9euSdPqE1Z2bA_BHA 提取碼: 7h97
?
錯誤: ?編碼GBK的不可映射字符 (?https://blog.csdn.net/talenter111/article/details/53418999 )
解決方法: 應該使用-encoding參數指明編碼方式,如:
javah -jni -encoding UTF-8 com.example.XXXX.XXXX.MainActivity
?
?
靜態注冊、動態注冊 示例代碼
?
靜態注冊、動態注冊
/**************靜態方法**********************/ extern "C" JNIEXPORT jstring JNICALL Java_com_example_calc_MainActivity_stringFromJNI(JNIEnv* env,jobject /* this */) {std::string hello = "Hello from C++";return env->NewStringUTF(hello.c_str()); } /*************************************************************/JNIEXPORT void JNICALL Java_com_example_jni_1demo_MainActivity_javaToC(JNIEnv *env, jobject obj) {// 獲取 類jclass fdClass = env->FindClass("com/example/jni_demo/MainActivity");// 獲取 普通方法idjmethodID _jmethodID = env->GetMethodID(fdClass, "_method", "()V");// 獲取 靜態方法idjmethodID _staticjmethodID = env->GetStaticMethodID(fdClass, "_staticMethod", "()V");// 調用 java中 的 普通方法env->CallVoidMethod(obj, _jmethodID);// 調用 java中 的 靜態方法env->CallStaticVoidMethod(fdClass, _staticjmethodID); }/************************* 動態注冊 nativate 方法 ********************************/ JNINativeMethod nativeMethod[] = { // 方法數組映射// 定義數組,用于綁定 java方法 和 C方法的 關系{"addMethod", "(FF)F", (void*)my_add}, // java中方法名,方法簽名,C++中方法名{"subMethod", "(FF)F", (void*)my_sub},{"mulMethod", "(FF)F", (void*)my_mul},{"divMethod", "(FF)F", (void*)my_div} };/************************* 實現 JNI_OnLoad 動態注冊方法 *******************************/ JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) {JNIEnv* env;if(vm->GetEnv((void**)&env, JNI_VERSION_1_6) != JNI_OK){return JNI_ERR;}// 獲取 java native 方法對應的 類jclass fdClass = env->FindClass("com/example/calc/MainActivity");// 注冊 java 層 native 方法jint retVal = env->RegisterNatives(fdClass, nativeMethod, sizeof(nativeMethod)/sizeof(nativeMethod[0]));if(retVal != JNI_OK){// 注冊失敗返回 -1return JNI_ERR;}return JNI_VERSION_1_6; //必須返回一個版本號 }圖示:
?
?
Android NDK 開發之 jni 靜態注冊
?
Android NDK 開發之 jni 靜態注冊 1:https://www.bilibili.com/video/BV1UE411A7rW?p=42
- Java?層?調用?C/C++?層 示例
Android NDK 開發之 jni 靜態注冊 2:https://www.bilibili.com/video/BV1UE411A7rW?p=43
- Java 層調用 C/C++ 層,然后從 C/C++ 層調用 Java 層的 普通 字段
- Java 層調用 C/C++ 層,然后從 C/C++ 層調用 Java 層的 靜態 字段
- Java 層調用 C/C++ 層,然后從 C/C++ 層調用 Java 層的 普通 方法
- Java 層調用 C/C++ 層,然后從 C/C++ 層調用 Java 層的 靜態 方法
?
?
Android NDK 開發之 動態注冊 JNI_OnLoad
?
Android NDK 開發之 動態注冊:https://www.bilibili.com/video/BV1UE411A7rW?p=44
- 動態注冊
?
JNI 動態注冊和靜態注冊的詳解:https://blog.csdn.net/bill_xiao/article/details/89095020
Android:JNI 動態注冊和靜態注冊的詳解(附android studio實例):https://blog.csdn.net/qq_37858386/article/details/103765111
Android Studio3.0開發JNI流程------JNI靜態注冊和動態注冊(多個類的native動態注冊-經典篇):https://blog.csdn.net/cloverjf/article/details/78878814
Android JNI 函數注冊的兩種方式(靜態注冊/動態注冊):https://www.jianshu.com/p/1d6ec5068d05
?
?
NDK 開發總結
?
Android NDK 開發總結:bilibili.com/video/BV1UE411A7rW?p=45
- 靜態注冊、動態注冊、使用?IDA?反編譯簡單?so?文件
?
回顧:https://www.bilibili.com/video/BV1UE411A7rW?p=46
- jni.h?文件介紹說明
安裝完jdk后就可以在安裝目錄的 include 目錄中找到 jni.h 頭文件(示例:C:\Program Files (x86)\Java\jdk1.8.0_261\include)
jni.h 頭文件,其實就是 API 文檔,里面有一些方法聲明、結構體、等圖示:
?
- 靜態注冊
如果是普通函數,第二個參數是 jobject
如果是靜態函數,第二個參數是 jclass
?
- 動態注冊
?
?
?
?
總結
以上是生活随笔為你收集整理的安卓逆向_15( 三 ) --- Android NDK 开发【 jni 静态注册、JNI_OnLoad 动态注册】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从零开始——PowerShell应用入门
- 下一篇: 安卓逆向_8 --- Android 调