您的位置:首页 > 移动开发 > Android开发

AndroidStudio之NDK与JNI配置详解

2015-02-12 15:45 357 查看

AndroidStudio之NDK与JNI配置详解

1.几点说明

搭建环境是在Ubuntu或者Windows下,不同之处文章中会有说明

开发平台是AndroidStudio,所以与eclipse可能会有些不同

在这里我们使用AndroidStudio1.0,NDK-r10d

2.NDK配置

首先下载NDK:ndk官方下载地址

在Linux 或者 Mac OS X中:

1.进入ndk包所在目录打开终端

2.更改权限,命令如下

chmod a+x android-ndk-r10d-linux-x86_64.bin


3.运行安装,命令如下

./android-ndk-r10d-linux-x86_64.bin


在Windows中:

1.进入ndk包所在位置

2.双击ndk包,下载包会自动解压(Windows不需要安装)

(注:以下主要是在Windows环境下做演示,Linux类似)

3.创建Android项目

这一步的设置及命名可以使用默认配置,


关于新建 jni 模块,有两种选择,一种是在我们创建的MyApp\app\src\main\下直接新建 jni 文件夹,然后进行相关配置。另一种是新建一个模块(module),以此为 jni 的单独模块来开发 jni 项目。笔者比较倾向于后者,因为 jni 的使用往往是可以独立于 java 代码的,所以分离出来不仅可以方便管理 C 代码,还便于移植。故下面我们就第二种方法进行详细描述。

4.创建JNI模块

如下图所示,右键MyApp,New->module


注意选择 Android Module



library/module name 我们设置为ThisJni,然后选择 Add no Activity.

最后的目录结构如右


5.创建 jni 头文件

首先,在MyApp中的MainActivity.java中添加native方法,也即对jni中的函数进行声明


其中,helloworld()为jni中函数的名称,我们现在这里定义好,下面会看的比较清楚.

打开AndroidStudio的终端,进入thisjni\src\main\目录,命令如下:

cd thisjni\src\main\


接着创建 jni 的头文件,命令如下:

javah -d jni -classpath C:\Users\lsh\AndroidStudioProjects\MyApp\app\src\main\java com.example.test.myapp.MainActivity


其中,-d 表示目标文件夹,即在哪个目录下生成.h文件,-classpath 表示源class所在路径,最后的com.example.test.myapp.MainActivity是包名。

执行后会在thisjni\src\main\jni\下生成一个.h文件,



6.创建 C 文件

在jni目录下,新建一个c文件,我们命名为hello.c,并写入下面的测试代码

#include "com_example_test_myapp_MainActivity.h"

JNIEXPORT jstring JNICALL Java_com_example_test_myapp_MainActivity_helloworld
(JNIEnv *env, jobject obj)
{
return (*env)->NewStringUTF(env, "Hello World ! We made it !");
}


需要注意的是,对于jni,c与c++代码都是可以得,但是语法略有不同,具体jni中代码编写可参考Java Programming Tutorial (JNI)

7.配置NDK环境

找到MyApp下的 local.properties,添加

ndk.dir=C:\\android-ndk-r10d


其中 C:\android-ndk-r10d 为我的ndk包所在路径,你需要根据你的包位置来更改,注意路径中的特殊符号需要用 \ 转义。

8.编译thisjni模块

特别需要注意的是,在windows环境下,ndk有一个bug,需要在jni目录下新建一个空的 c 文件命名为util.c,否则编译会报错。在linux 或 Mac OS X 下则不需要。编译则十分简单,直接选择编译thisjni即可。

9.在 app 中使用编译的jni

首先,我们需要在代码中添加loadLibrary部分,代码如下所示:



然后,配置依赖,依次进行下述操作:

右键app -> open module settings,

再按照下图操作


添加thisjni模块,apply后AndroidStudio会自动同步gradle,同步完成后就大功告成啦!现在你可以在MainActivity.java中调用helloworld()方法,它会返回给你String类型的信息”Hello World ! We made it !”。

10.额外说明

有时候,我们需要生成某些类型的 .so 文件(上面生成的 .so 文件为默认,读者可在AndroidStudioProjects\MyApp\thisjni\build\intermediates\ndk\debug\lib下观察生成的 .so 文件)

这就需要我们更改thisjni的build.gradle文件,具体可以参考stackoverflow上的帖子http://stackoverflow.com/questions/20674650/how-to-configure-ndk-with-android-gradle-plugin-0-7
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息