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 动态注册】相关推荐

  1. 安卓逆向_15( 二 ) --- Android Studio 3.6.3 JNI 环境配置 和 so 生成开发 demo

    From:Android Studio 3.0 JNI 的实现:https://blog.csdn.net/ziyoutiankoong/article/details/79696279 Androi ...

  2. 安卓逆向_15( 一 ) --- JNI 和 NDK

    From:较详细的介绍JNI:https://blog.csdn.net/lizhifa2011/article/details/21021177 From:https://www.jb51.net/ ...

  3. Android NDK开发之旅(2):一篇文章搞定Android Studio中使用CMake进行NDK/JNI开发

    Android NDK开发之旅(2):一篇文章搞定android Studio中使用CMake进行NDK/JNI开发 (码字不易,转载请声明出处:http://blog.csdn.NET/andrex ...

  4. 【Android NDK 开发】JNI 方法解析 ( JNIEnv *env 参数 )

    文章目录 一. JNI 方法解析 二. JNIEnv *env 参数解析 三. C 语言 环境中 JNIEnv *env 参数解析 四. C ++ 环境中 JNIEnv *env 参数解析 总结 : ...

  5. Android NDK开发(三)——常见错误集锦以及LOG使用,androidndk

    Android NDK开发(三)--常见错误集锦以及LOG使用,androidndk 转载请注明出处:http://blog.csdn.net/allen315410/article/details/ ...

  6. Android NDK开发之旅(3): 详解JNI数据类型与C/C++、Java之间的互调

    Android NDK开发之旅(3):详解JNI数据类型与C/C++.Java之间的互调 (码字不易,转载请声明出处:http://blog.csdn.net/andrexpert/article/d ...

  7. 【Android NDK 开发】JNI 动态注册 ( 动态注册流程 | JNI_OnLoad 方法 | JNINativeMethod 结构体 | GetEnv | RegisterNatives )

    文章目录 I . 动态注册流程 ( 总结 ) II . JNI_OnLoad 方法 III . 被注册的本地 C/C++ 方法参数 IV . JNINativeMethod 结构体 ( 核心重点 ) ...

  8. Android 高级开发 JNI NDK 介绍与使用

    Android 高级开发 JNI & NDK 介绍与使用 前言 对于没接触过的领域,即是挑战也是机遇,不仅能够提升自己的能力.还能够学习到新的技术知识 而学习新的技术的时候,最好是从头开始按照 ...

  9. OpenCV android sdk配置OpenCV android NDK开发实例

    OpenCV android sdk配置OpenCV android NDK开发实例 [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/det ...

最新文章

  1. OpenGL ES 如何能看到一个物体内部和象3dmax中能只显示网格线
  2. 谷歌大佬花了半年整理的Leetcode刷题笔记
  3. java 按位_Java中的按位运算
  4. SQL过滤字符后手工注入漏洞测试(第1题)
  5. 讲道理,我觉得TensorFlow太逊了
  6. 马恩驰:R向量化运算
  7. Jenkins实现生产环境部署文件的回滚操作(Windows)
  8. 首发:成功解决MediaCodec中decoder超过720出错的问题
  9. C语言项目-俄罗斯方块
  10. 联发科10月营收238亿新台币 近6个月低点
  11. 更精进,更超能 | 一起开启 AI+X 微软认证未来创变者计划
  12. Swin-Unet跑自己的数据集(Transformer用于语义分割)
  13. USB设备仿真框架设计指南——4.DSF中的COM对象
  14. 物流快递信息查询管理系统网站(JSP+HTML+MySQL)
  15. 3D标签云的简单实现
  16. QT/C++/Eigen 自己实现的MATLAB中的std()函数,矩阵按照列求标准差
  17. 【信号与系统】笔记(5-3)逆 z 变换
  18. UBUNTU如何修改IP
  19. 医嘱共享与his系统和医保服务器,事半功倍!医院HIS系统下连带医嘱组合是如何工作的?...
  20. 【DevFest 2020】人工智能专家讲座与上手实操,落地前沿行业技术 _ AI 专场

热门文章

  1. 美团外卖Android平台化的复用实践
  2. 生产Docker应用重启排查经历
  3. ListView原理简单介绍(着重介绍getView被调用的一系列过程)
  4. 12 操作系统第三章 内存管理 非连续分配管理方式 基本分页存储管理 基本分段存储管理 段页式存储管理
  5. LeetCode 876 Middle of the Linked List 解题报告
  6. [转] 三种Python下载url并保存文件的代码
  7. 查看Oracle有哪些表或者视图
  8. 初探数位DP-hdu2089
  9. 关于EOF,转自新浪微博
  10. 89C52控制1602A液晶的计时器