android studio 使用JNI调用C程序

来源:互联网 发布:php小例子 编辑:程序博客网 时间:2024/05/18 06:23

安装配置NDK

下载

http://developer.android.com/intl/zh-cn/ndk/downloads/index.html#download

下载后运行exe程序会在当前目录下解压缩出来NDK的所有文件,移到本地的目录下。

配置环境变量

打开windows系统,属性,环境变量,定义下面两个部分:

前者为NDK文件放置的目录,后者为:%NDK_ROOT%;注意分号。

验证

cmd里面输入ndk-build,没有提示找不到差不多配置就算完成了。(正确应提示could not find application…)

配置android studio环境

1

在gradle.properties文件中添加 Android.useDeprecatedNdk = true

其中gradle.properties在工程目录下(注意:不是gradle–wrapper目录下的这个文件)。

2

在当前android studio的工程设置面板(工程名字上右键open module Setting或F4),在弹出的界面中选中SDK Location,配置好最下面的NDK location,找到对应的目录,我的已经配置好的。

3

在工程目录下的local.porperties文件中添加为下面样式:

ndk.dir=D:\\Android\\sdk\\ndk-bundlesdk.dir=D:\\Android\\sdk

我的工程在新建后已经默认生成好了这个内容。

4

在gradle文件中添加以下内容(图片1处),该app的gradle文件中。

注意这里的moduleName,是我们在之前自己编写的类里面加载的so库名

 ndk {    moduleName "JniTest"    ldLibs "log", "z", "m"    abiFilters "armeabi", "armeabi-v7a", "x86"}

有的文档说也需要添加以下的内容在gradle中(图片2处)

sourceSets{    main{        jniLibs.srcDirs = ['libs']    }}

声明native方法与编译

这个类是java与C/C++交互的中介,方法由java声明,由C/C++实现。

这儿需要新建一个类,不在Activity类里面写是为了避免编译时报错:找不到android.support.v7.app.AppCompatActivity。

public class myJNI {  //加载so库    static {        System.loadLibrary("JniTest");    }  //native方法    public static native String sayHello();}

编译

这儿的路径部分很重要。

可以在android studio的终端下的命令行工具里面编译,打开该工具的方法为软件最下方的Terminal。如果没有的话可以点击菜单栏的view–Tool Windows–Terminal。

class文件

打开后当前命令行处于的目录部分不确定,首先将那个native所在的方法编译为class文件。

F:\Temp\Other\JNI\myJni\app\src\main\java\app\tongbang\com\myjni>javac myJNI.java

注意目录部分。

PS:好像可以
执行Build->Cliear Project和Rebuild Project生成class文件

h文件

接着编译h文件,需要更换目录,这里的路径变更使用cd命令(不会cd命令的百度cmd进出文件夹方法),如下所示:

F:\Temp\Other\JNI\myJni\app\src\main\java>javah -jni app.tongbang.com.myjni.myJNI

到达工程的java目录下,注意最后面的app.tongbang.com.myjni为工程的包名,myJNI为类名,编译成功后会在工程的包名下生成文件app_tongbang_com_myjni_myJNI.h

构建C文件

在编译好h文件后,打开该h文件,复制全部内容,在工程目录下的app–src–main下新建文件夹jni,再在里面新建c文件比如main.c,将h文件的内容复制到里面,注意的是,这儿的文件内容是头文件的文件内容,所以必需要把原本的函数声明内容变更为具体的函数内容实现。

此外,在写完c文件后,需要在该目录(jni)下新建一个c文件,名字为util.c,内容为空,网上有的帖子说不加这个文件会报错,但是我没有加成功实现了,可加可不加。

如果前面的步骤正常,那么此时编译应该可以成功了。可以实体化带有调用c程序的类,使用里面的方法。

生成so库与使用

在工程编译成功后,so库也已经成功产生,在项目的app\build\intermediates\ndk\debug\lib路径下

在src\main下新建文件夹jniLIB,并将生成的SO文件拷贝到该文件夹下

流程

编写静态方法(用java声明)–>编译生成class文件—>编译生成h文件—->编写C文件(用C/C++实现)
—->配置NDK—->配置so库—->在Activity调用(Java调用C/C++)。

原创粉丝点击