AndroidStudio下的JNI开发教程
Android Studio下的JNI开发教程
这是我在CSDN的第⼀篇博⽂,想了很久⾃⼰能写什么内容,很纠结呀,感觉简单的内容不愿意写,复杂的内容,⾃⼰⼜没有能⼒讲透。所以,选了JNI作为⾃⼰在CSDN的开篇 !其实⽬的是希望能⽤写技术博客的⽅式,督促⾃⼰学习。并且希望读者们,可以通过阅读我的博客,能帮助你们进步!这也许会成为我持续更博的最⼤动⼒。
内容概述
什么是JNI
Android Studio 下JNI开发环境的配置
如何使⽤Android Studio开发JNI项⽬
Module的gradle⽂件配置以及其它配置
常见问题分析及解决
1、什么是JNI和NDK?
NDK介绍
Android NDK 是在SDK前⾯⼜加上了“原⽣”⼆字,即Native Development Kit,因此⼜被Google称为“NDK”。
众所周知,Android程序运⾏在Dalvik虚拟机中,NDK允许⽤户使⽤类似C / C++之类的原⽣代码语⾔执⾏部分程序。
NDK包括了:
从C / C++⽣成原⽣代码库所需要的⼯具和build files。将⼀致的原⽣库嵌⼊可以在Android设备上部署的应⽤程序包⽂件(application packages files ,即.apk⽂件)中。⽀持所有未来Android平台的⼀系列原⽣系统头⽂件和库
为何要⽤到NDK?
概括来说主要分为以下⼏种情况:
1. 代码的保护,由于apk的java层代码很容易被反编译,⽽C/C++库被反编译的难度较⼤。
2. 在NDK中调⽤第三⽅C/C++库,因为⼤部分的开源库都是⽤C/C++代码编写的。
3. 便于移植,⽤C/C++写的库可以⽅便在其他的嵌⼊式平台上再次使⽤。
——
JNI介绍
JNI是Java Native Interface的缩写,它提供了若⼲的API实现了Java和其他语⾔的通信(主要是C&C++)。它允许Java代码和其他语⾔写的代码进⾏交互。JNI⼀开始是为了本地已编译语⾔,尤其是C和C++⽽设计的,但是它并不妨碍你使⽤其他编程语⾔,只要调⽤约定受⽀持就可以了。使⽤java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚⾄是必须的。例如,使⽤⼀些旧的库,与硬件、操作系统进⾏交互,或者为了提⾼程序的性能。JNI标准⾄少要保证本地代码能⼯作在任何Java 虚拟机环境。——
2、Android Studio 下JNI开发环境的配置
因笔者使⽤的是Mac OS系统的电脑,这⾥以Mac版Android Studio为例作为讲解
安装Android Studio的过程我默认⼤家都会了,不会的,参考 ,我们在这讲下NDK的下载⽅法。
创建⼀个HelloWorld⼯程
创建过程过于简单,忽略跳过!
NDK下载
1、 选择Android Studio -> Preferences
2、 Appearance&Behavior-> System Settings -> Adnroid SDK 下,选择SDK Tools 选项卡,到NDK并且勾选,点击OK,即可⾃动下载,下载完成,点击Finish按钮关闭参考即可
3、下载完成之后,选择File->Project Structure->SDK Location 设置NDK的路径
android学习教程3、下载完成之后,选择File->Project Structure->SDK Location 设置NDK的路径
还可以在⽹站上⾯下载NDK,下载完成,参考步骤3,同样的⽅法设置即可,这⾥不做详细介绍。
当然,假如你⾮常熟悉Android Studio的⽬录结构,你也可以通过直接修改local.properties,⾥⾯也可以指定NDK的所在⽬录,需要指出的是,因为笔者是从Eclipse平台迁移过来Android Studio的,所以习惯使⽤Eclipse的⽬录结构,所以初学者可能会发现,我下⾯的截图,与你的⽬录结构不太⼀致,其实,你只需要选择以项⽬形式(Project)展⽰即可,Studio默认的⽬录结构显⽰⽅式为Android:
到这⾥,JNI开发的环境配置就OK啦,下⾯让我们⼀起进⼊正题吧,开发属于我们⾃⼰的第⼀个JNI项⽬吧,想想还是有些⼩激动呢!
哈哈哈哈~~~~
3、如何使⽤Android Studio开发JNI项⽬
上⾯我们已经搭建好了JNI的开发环境,并且创建了⼀个HelloWorld的项⽬,接下来,我们开始进⼊正题咯,前戏N久,⼤家应该到猴急了吧?别着急,⼼急吃不了热⾖腐,那么,我们开始咯!
在MainActivity同⼀包下(个⼈喜欢,笔者为了⽅便)创建⼀个类TestJni.java,⽤于加载SO⽂件,同时添加⼀个native⽅法package st.anzhi;
/**
* Created by heguowen on 2017/5/17.
*/
public class TestJni {
static {
System.loadLibrary("anzhi_testjni");
}
public native  String sayHello();
}
利⽤javah命令⽣成对应的JNI头⽂件,1、打开命令⾏(Terminal),2、把当前⽬录cd到java⽬录下,3、通过javah命令产⽣头⽂件。具体命令如下,javah的使⽤⽅法,⿇烦⾃⾏百度,读者也可先不必纠结命令⾏的⼀串命令究竟是啥意思
cd app/src/main/java
javah -d ../jni -jni st.anzhi.TestJni
现在,我们已经⽣成了⼀个TestJni类对应的头⽂件啦,接下来,在当前⽬录下复制⽣成的头⽂件,重命名为AnzhiTestJni.c,名字任意取即可,打开此⽂件并进⾏修改,代码如下:
#include <com_anzhi_test_anzhi_TestJni.h>
JNIEXPORT jstring JNICALL Java_com_anzhi_test_anzhi_TestJni_sayHello
(JNIEnv *env , jobject obj){
return (*env) -> NewStringUTF(env,"ANZHI JNI TEST!");
}
同时,你也可以打开刚刚⽣成的头⽂件进⾏对⽐,我们发现,这两个⽂件⾮常类似,我只是在它的基础上删掉⼀些注释并且将⽅法的形参取了⼀个变量名,然后加了⼀个⽅法体的实现,没错,就是这么简单!在这⾥,我们也将⾃动⽣成的头⽂件的代码贴出来,⽅便读者做对⽐

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。