参考地址: https://www.cnblogs.com/jymblog/p/5526865.html
https://www.jianshu.com/p/ac00d59993aa
1.JNI的概述
JNI的全称就是Java Native Interface,顾名思义,就是Java和C/C++相互通信的接口,就好比买卖房子都需要找中介一样,这里的JNI就是Java和C/C++通信的中介,一个中间人。
2.JNI的用途
1.主要是一些算法,因为c/c++比Java效率高,所以应用运行起来速度比较快,特别是一些游戏中的算法.
2.为了保密,都知道apk都可以被反编译,就算有代码混淆,也只是难看懂,并不是完全看不懂,但用jni编译成.so就不同了,所以可以达到商业机密不泄露的目的。
3.一个平台(C++代码)迁移到Android平台,底层逻辑是相同的,这样就可以通过移植,利用JNI调用底层C++代码,避免相同逻辑的代码重复去写,不过这个过程一定要注意底层对象的释放问题。
4.与一些硬件驱动的通信(串口等)
- 扩展:JNI扩展了JVM能力,驱动开发,例如开发一个wifi驱动,可以将手机设置为无限路由;
- 高效: 本地代码效率高,游戏渲染,音频视频处理等方面使用JNI调用本地代码,C语言可以灵活操作内存;
- 复用: 在文件压缩算法 7zip开源代码库,机器视觉 OpenCV开放算法库等方面可以复用C平台上的代码,不必在开发一套完整的Java体系,避免重复发明轮子;
- 特殊: 产品的核心技术一般也采用JNI开发,不易破解;
3.编写Jni实现native方法的调用
1.编写jni文件,实现本地方法
public class MainActivity extends AppCompatActivity {
private Button mBtn;
private Button mjni;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBtn = ((Button) findViewById(R.id.btn));
mBtn.setOnClickListener(new View.OnClickListener() {
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)
@Override
public void onClick(View v) {
DisplayManager mDisplayManager;//屏幕管理类
Display[] displays;//屏幕数组
mDisplayManager = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE);
displays = mDisplayManager.getDisplays();
if (displays != null) {
Presentation presentation = new MyPresentation(MainActivity.this, displays[1]);
presentation.show();
}
}
});
mjni = ((Button) findViewById(R.id.btn_jni));
mjni.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String info=JniMethod.getNativeString("你好");
Toast.makeText(MainActivity.this, info, Toast.LENGTH_SHORT).show();
}
});
}
}
2.生成.h的头文件
该文件即连接java和c(c++)的桥梁,里面有Android工程里本地方法的声明。这个文件可以在“控制台”用javah命令自动生成
在下面这个路径生成了目录和.h的头文件(头文件的名称不可以修改)
3.新建cpp文件,进行方法的实现,(还要多加个空的cpp文件empty.cpp)
.h文件的方法声明
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_aier_testdemos_JniMethod */
#ifndef _Included_com_aier_testdemos_JniMethod
#define _Included_com_aier_testdemos_JniMethod
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_aier_testdemos_JniMethod
* Method: getNativeString
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_aier_testdemos_JniMethod_getNativeString
(JNIEnv *, jclass, jstring);
#ifdef __cplusplus
}
#endif
#endif
cpp文件的方法实现(JniMethod.cpp)
#include <jni.h>
#include<com_aier_testdemos_JniMethod.h>
#include<stdio.h>
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_aier_testdemos_JniMethod
* Method: getNativeString
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_aier_testdemos_JniMethod_getNativeString
(JNIEnv *, jclass, jstring);
#ifdef __cplusplus
}
#endif
JNIEXPORT jstring JNICALL Java_com_aier_testdemos_JniMethod_getNativeString
(JNIEnv *env, jclass, jstring){
return env->NewStringUTF("I'm comes from to Native Function!");
}
4.把jni文件加复制,放到main目录下
5.配置相关配置
6.编译运行!