androidJNI开发

炒沙作縻终不饱,缕冰文章费工巧。这篇文章主要讲述androidJNI开发相关的知识,希望能为你提供帮助。
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调用。
【androidJNI开发】 
 
 
 
小笔记:
* javac是把java文件编译成.class文件
*javah是jni里面的生成.h文件的*javac  可以将java源文件编译为class字节码文件
如  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
     

androidJNI开发

文章图片

 
    (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)、
androidJNI开发

文章图片

          将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):
androidJNI开发

文章图片
文件中
ndk {
moduleName "TestJNI"//生成的库(.so)的名字,加载库是的名字
ldLibs "log", "z", "m"
abiFilters "armeabi", "armeabi-v7a", "x86"//

//输出指定三种abi体系结构下的so库



}

androidJNI开发

文章图片

(6)在重新构建项目,(完成)就可以通过类的对象调用本地方法了
 

 
 
               
 
   



















    推荐阅读