android JNI开发
1、NDK简介
NDK(Native Development Kit)NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。NDK集成了交叉编译器(交叉编译器需要UNIX或LINUX系统环境),并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。
2、为什么要使用NDK
1.)代码的保护。由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。
2.)可以方便地使用现存的开源库。大部分现存的开源库都是用C/C++代码编写的。
3.)提高程序的执行效率。将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。
4.)便于移植。用C/C++写得库可以方便在其他的嵌入式平台上再次使用。
3、什么是JNI?
JNI全称为:Java Native Interface。JNI 是本地编程接口,它使得在 Java 虚拟机内部运行的 Java 代码能够与用其它语言(如 C、C++)编写的代码进行交互
4、为什么使用JNI?
JNI的目的是使java方法能够调用c实现的一些函数。
5、安卓中的so文件是什么?
Android中用到的so文件是一个c++的函数库。在android的JNI中,要先将相应的C语言打包成so库,然后导入到lib文件夹中供java调用。
小笔记:
*javah是jni里面的生成.h文件的
如 javac HelloWorld.java
运行javac命令后,如果成功编译没有错误的话,会出现一个HelloWorld.class的文件。
java 可以运行class字节码文件
如 java HelloWorld
注意java命令后面不要加.class
***************************************************************************************************************************
android Studio 中开发JNI:
准备工作:jdk版本必须在1.7以上,并配置环境变量(网上很多不说),下载NDK并配置环境变量,查看自己是否安装NDK,在Android Studio 的命令窗口ndk-build,出现下面结论,表示自己安装了NDK
(1)、使用Java代码,写本地方法
public class TestJNI { static { System.loadLibrary("TestJNI");//加载。so库 } public native boolean Init(); public native int Add(int x, int y); public native void Destory(); }
(2)、
将Java文件编译成.classes文件
(3)、在Android Studio 的Termanal 窗口进入main的工作空间,输入以下命令javah -d jni -classpath sdk的路径\platforms\android-19\android.jar;..\..\build\intermediates\classes\debug com.example.administrator.rxjavatest.JNI.TestJNI
运行结果:会在Android结果目录下app下自动生成cpp目录,并生成包名-文件名.h的头文件(包名中间是-连接)
(4)、在cpp包下创建一个c文件(加载刚生成的头文件,并实现方法),这里简单实现
#include<com_example_administrator_rxjavatest_JNI_TestJNI.h> JNIEXPORT jboolean JNICALL Java_com_example_administrator_rxjavatest_JNI_TestJNI_Init (JNIEnv *, jobject){ return true; } /* * Class: com_example_administrator_rxjavatest_JNI_TestJNI * Method: Add * Signature: (II)I */ JNIEXPORT jint JNICALL Java_com_example_administrator_rxjavatest_JNI_TestJNI_Add (JNIEnv *, jobject, jint, jint){ return 0; } /* * Class: com_example_administrator_rxjavatest_JNI_TestJNI * Method: Destory * Signature: ()V */ JNIEXPORT void JNICALL Java_com_example_administrator_rxjavatest_JNI_TestJNI_Destory (JNIEnv *, jobject){ return ; }
(5):文件中
ndk {
moduleName "TestJNI"//生成的库(.so)的名字,加载库是的名字
ldLibs "log", "z", "m"
abiFilters "armeabi", "armeabi-v7a", "x86"//
//输出指定三种abi体系结构下的so库
}
(6)在重新构建项目,(完成)就可以通过类的对象调用本地方法了