# Android_Jni_cpp **Repository Path**: wsdby/Android_Jni_cpp ## Basic Information - **Project Name**: Android_Jni_cpp - **Description**: 基于 Androidstudio 、cmake 、 c/c++ 的jni技术。 学习过程的demo . - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2022-05-25 - **Last Updated**: 2022-05-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Android_Jni_cpp 基于 Androidstudio 、cmake 、 c/c++ 的jni技术。 学习过程的demo . ---- 当前demo 演示效果: - [x] java调用c++ - [x] c++回调Java函数 - [x] c++获取并修改Java静态变量 - [x] Java开启子线程让c++执行耗时操作,并更新Java ui - [x] 传递并修改数组 - [x] c++创建Java定义的对象并返回 - [ ] c++调用第三方库实现加密解密 - [ ] c++读取文件 - [ ] c++接收Java传递的控件 并绘制图像 - [x] c++获取apk包名 - [x] c++获取apk签名 哈希值 - [ ] c++ 调用QT [JNI中文资料文档_20171019整理.pdf](JNI中文资料文档_20171019整理.pdf) //使用NDK JNI的场景: 1、提高代码安全性。因为.so文件反编译困难。(加密一些算法等) 2、方便使用已经存在的c/c++库。 3、提高某些特定情况下的执行效率。(因为c/c++的效率比java要高。不过,并不能明显提升android程序的性能) -- JNIEnv : JavaVM 在线程中的代表, 每个线程都有一个, JNI 中可能有很多个 JNIEnv; 每个JNIEnv 都是线程专有的, 其它线程不能使用本线程中的 JNIEnv, 线程 A 不能调用 线程 B 的 JNIEnv; 但是,一个本地方法可被不同的 Java 线程所调用,因此可以接受不同的 JNIEnv。 JNI可以支持C或C++,从目前为止我们写过的JNI代码均为C实现的,即文件名为.C 。 使用C++好处就是可以使用很多库 。 C++的代码更简练。 JNIEnv 作用 : -- 调用 Java 函数 : JNIEnv 代表 Java 运行环境, 可以使用 JNIEnv 调用 Java 中的代码; -- 操作 Java 对象 : Java 对象传入 JNI 层就是 Jobject 对象, 需要使用 JNIEnv 来操作这个 Java 对象; //JNI的数据类型分为基本数据类型、引用类型M ![image](./pics/p1.png) ![image](./pics/p2.png) //JNI签名: java中,对于某一个对象来说, 可以用过方法名和参数 就可以确定唯一的一个方法。 在JNI中,通过函数名和 签名信息 可以确定唯一的方法。 签名的规则如下: ![image](./pics/p3.png) 2、类的签名(注意末尾的分号) L+包名+类名+; java.lang.String -> Ljava/lang/String; 3、对象签名 跟它所属的类的签名一样。 4、数组签名 格式: [类型 double[ ] -> [ D 5、多维数组签名 格式: n个 [ + 类型签名 int[ ] [ ] -> [[I 6、方法签名 (跟方法名无关) 格式: (参数类型签名) + 返回值类型签名 boolean fun( int a , double b , int[ ] c) -> (ID[I)Z void fun(int i) -> (I)V