android JNI开发

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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调用。

 

 

 

 

小笔记:

* 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

     技术分享

 

    (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)在重新构建项目,(完成)就可以通过类的对象调用本地方法了

 


 

 

              

 

 
 



















以上是关于android JNI开发的主要内容,如果未能解决你的问题,请参考以下文章

android开发源代码分析--多个activity调用多个jni库的方法

Android JNI开发示例

深入浅出 - Android系统移植与平台开发- Android JNI机制

Android JNI开发

Android官方开发文档Training系列课程中文版:Android的JNI相关

Android JNI编程—JNI基础