安卓逆向_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");
// 获取 普通方法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
- 动态注册
相关文章
- 安卓逆向_15( 二 ) --- Android Studio 3.6.3 JNI 环境配置 和 so 生成开发 demo
- 安卓逆向_5 --- Android 学习
- Windows下Nexus 5的Android 5.0以上版本官方ROM的刷机教程
- Android敲诈者病毒“安卓性能激活”分析(2015年9月版)
- Android Studio第一次启动的Fetching android sdk component information的问题
- Android 异常 android.os.NetworkOnMainThreadException
- Android 屏幕适配攻略(四)获取手机屏幕的相关信息 与动态设置控件的大小
- Android动态设置字体颜色
- Android Studio 打包APK(详细版)
- Eclipse中android工程C++文件中出现的莫名其妙的错误
- Android网络请求与数据解析,使用Gson和GsonFormat解析复杂Json数据
- Android Studio一直显示Building“project name”Gradle project info问题详解
- 《移动安全》(1)Android开发基础:安卓操作系统架构与应用程序组件
- 《Android开发进阶:从小工到专家》——第2章,第2.2节必须掌握的最重要的技能——自定义控件
- 《Android安全技术揭秘与防范》——第1章,第1.3节Android和iOS系统对比
- 《Android游戏开发详解》——第3章,第3.3节接口
- Android View体系(四)从源码解析Scroller
- Android---- 获取当前应用的版本号和当前android系统的版本号
- 于 Android NDK 的学习之旅-----数据传输(基本数据类型和数组传输)
- android编译系统的makefile文件Android.mk写法如下
- 浅谈Android系统开发中LOG的使用
- android之BitmapFactory.Options的使用
- android开发:Android 中自定义View的应用
- Android Studio报错:Could not find method android() for arguments
- 如何生成Android签名证书、安卓签名获取工具获取APP签名报错:NameNotFoundException: Signs is null的问题
- Android Studio升级或更新项目,经常造访的“Could not find com.android.tools.build :gradle: x.x.x”的原因分析
- android 自定义ViewGroup和对view进行切图动画实现滑动菜单SlidingMenu[转]
- 【安卓开发快速入门】Android Studio(3.5.2)安装
- 【Android开发经验】android:windowSoftInputMode属性具体解释
- Android回调事件传播-android学习之旅(四十五)
- android之照相、相冊裁剪功能的实现过程
- 安卓开发笔记(三十三):Android仿写微信发现
- 安卓开发笔记(二十):利用夜神模拟器调试运行Android Studio的apk
- [Android] android:visibility属性应用
- Android Studio项目导入aar包报错