zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

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

2023-09-11 14:13:59 时间

 

 

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

    // 获取 普通方法id
    jmethodID _jmethodID = env->GetMethodID(fdClass, "_method", "()V");

    // 获取 静态方法id
    jmethodID _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)
    {
        // 注册失败返回 -1
        return 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

 

  • 动态注册