日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

安卓逆向_15( 三 ) --- Android NDK 开发【 jni 静态注册、JNI_OnLoad 动态注册】

發(fā)布時(shí)間:2024/7/23 Android 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 安卓逆向_15( 三 ) --- Android NDK 开发【 jni 静态注册、JNI_OnLoad 动态注册】 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

?

Android Studio開(kāi)發(fā)JNI示例:https://blog.csdn.net/wzhseu/article/details/79683045

JNI_動(dòng)態(tài)注冊(cè)_靜態(tài)注冊(cè).zip :?https://pan.baidu.com/s/1wpTYA9euSdPqE1Z2bA_BHA 提取碼: 7h97

?

錯(cuò)誤: ?編碼GBK的不可映射字符 (?https://blog.csdn.net/talenter111/article/details/53418999 )
解決方法: 應(yīng)該使用-encoding參數(shù)指明編碼方式,如:
javah -jni -encoding UTF-8 com.example.XXXX.XXXX.MainActivity

?

?

靜態(tài)注冊(cè)動(dòng)態(tài)注冊(cè) 示例代碼

?

靜態(tài)注冊(cè)、動(dòng)態(tài)注冊(cè)

/**************靜態(tài)方法**********************/ 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");// 獲取 靜態(tài)方法idjmethodID _staticjmethodID = env->GetStaticMethodID(fdClass, "_staticMethod", "()V");// 調(diào)用 java中 的 普通方法env->CallVoidMethod(obj, _jmethodID);// 調(diào)用 java中 的 靜態(tài)方法env->CallStaticVoidMethod(fdClass, _staticjmethodID); }/************************* 動(dòng)態(tài)注冊(cè) nativate 方法 ********************************/ JNINativeMethod nativeMethod[] = { // 方法數(shù)組映射// 定義數(shù)組,用于綁定 java方法 和 C方法的 關(guān)系{"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} };/************************* 實(shí)現(xiàn) JNI_OnLoad 動(dòng)態(tài)注冊(cè)方法 *******************************/ 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 方法對(duì)應(yīng)的 類jclass fdClass = env->FindClass("com/example/calc/MainActivity");// 注冊(cè) java 層 native 方法jint retVal = env->RegisterNatives(fdClass, nativeMethod, sizeof(nativeMethod)/sizeof(nativeMethod[0]));if(retVal != JNI_OK){// 注冊(cè)失敗返回 -1return JNI_ERR;}return JNI_VERSION_1_6; //必須返回一個(gè)版本號(hào) }

圖示:

?

?

Android NDK 開(kāi)發(fā)之 jni 靜態(tài)注冊(cè)

?

Android NDK 開(kāi)發(fā)之 jni 靜態(tài)注冊(cè) 1:https://www.bilibili.com/video/BV1UE411A7rW?p=42

  • Java?層?調(diào)用?C/C++?層 示例

Android NDK 開(kāi)發(fā)之 jni 靜態(tài)注冊(cè) 2:https://www.bilibili.com/video/BV1UE411A7rW?p=43

  • Java 層調(diào)用 C/C++ 層,然后從 C/C++ 層調(diào)用 Java 層的 普通 字段
  • Java 層調(diào)用 C/C++ 層,然后從 C/C++ 層調(diào)用 Java 層的 靜態(tài) 字段
  • Java 層調(diào)用 C/C++ 層,然后從 C/C++ 層調(diào)用 Java 層的 普通 方法
  • Java 層調(diào)用 C/C++ 層,然后從 C/C++ 層調(diào)用 Java 層的 靜態(tài) 方法

?

?

Android NDK 開(kāi)發(fā)之 動(dòng)態(tài)注冊(cè) JNI_OnLoad

?

Android NDK 開(kāi)發(fā)之 動(dòng)態(tài)注冊(cè):https://www.bilibili.com/video/BV1UE411A7rW?p=44

  • 動(dòng)態(tài)注冊(cè)

?

JNI 動(dòng)態(tài)注冊(cè)和靜態(tài)注冊(cè)的詳解:https://blog.csdn.net/bill_xiao/article/details/89095020

Android:JNI 動(dòng)態(tài)注冊(cè)和靜態(tài)注冊(cè)的詳解(附android studio實(shí)例):https://blog.csdn.net/qq_37858386/article/details/103765111

Android Studio3.0開(kāi)發(fā)JNI流程------JNI靜態(tài)注冊(cè)和動(dòng)態(tài)注冊(cè)(多個(gè)類的native動(dòng)態(tài)注冊(cè)-經(jīng)典篇):https://blog.csdn.net/cloverjf/article/details/78878814

Android JNI 函數(shù)注冊(cè)的兩種方式(靜態(tài)注冊(cè)/動(dòng)態(tài)注冊(cè)):https://www.jianshu.com/p/1d6ec5068d05

?

?

NDK 開(kāi)發(fā)總結(jié)

?

Android NDK 開(kāi)發(fā)總結(jié):bilibili.com/video/BV1UE411A7rW?p=45

  • 靜態(tài)注冊(cè)、動(dòng)態(tài)注冊(cè)、使用?IDA?反編譯簡(jiǎn)單?so?文件

?

回顧:https://www.bilibili.com/video/BV1UE411A7rW?p=46

  • jni.h?文件介紹說(shuō)明

安裝完jdk后就可以在安裝目錄的 include 目錄中找到 jni.h 頭文件(示例:C:\Program Files (x86)\Java\jdk1.8.0_261\include)

jni.h 頭文件,其實(shí)就是 API 文檔,里面有一些方法聲明、結(jié)構(gòu)體、等圖示:

?

  • 靜態(tài)注冊(cè)

如果是普通函數(shù),第二個(gè)參數(shù)是 jobject

如果是靜態(tài)函數(shù),第二個(gè)參數(shù)是 jclass

?

  • 動(dòng)態(tài)注冊(cè)

?

?

?

?

總結(jié)

以上是生活随笔為你收集整理的安卓逆向_15( 三 ) --- Android NDK 开发【 jni 静态注册、JNI_OnLoad 动态注册】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。