炒沙作縻终不饱,缕冰文章费工巧。这篇文章主要讲述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
文章图片
(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技术生成并调用.so动态库实现详解
- Android体系结构及activity生命周期
- Android系统中自定义按键的短按双击长按事件
- Android基础性能检测与分析
- android 开发Handler源码剖析
- Tesseract OCR集成Android Studio实现OCR识别
- 如何保护你的服务器免受勒索软件的侵害(方法简介)
- 如何在Windows 10上取消模糊图片(10种最佳修复方法)
- 如何永久删除激活Windows 10水印(解决方法指南)