Android中Java调用C/C++

时间:2024-03-20 19:23:22

①  Javah配置,Tool settings填写的三项在不同平台是相同的,无需改动。

Android中Java调用C/C++Android中Java调用C/C++

②  安装NDK ,下载安装包并安装。

③  在AS中配置NDK路径

Android中Java调用C/C++   Android中Java调用C/C++Android中Java调用C/C++Android中Java调用C/C++

④  Make project,执行后再app/build/intermediates下会生成classes目录,内为生成的class文件。

Android中Java调用C/C++Android中Java调用C/C++

⑤  先创建要引用C代码的类,这里创建了一个MathKit类,并在类中写:

Android中Java调用C/C++Android中Java调用C/C++

⑥  用javah命令生成jni目录,及对应的头文件

Android中Java调用C/C++Android中Java调用C/C++

上述命令在src/main/java中执行,执行结束后在main的同级目录下会生成一个jni目录,里边还有对应的.h头文件。

Android中Java调用C/C++Android中Java调用C/C++

⑦  修改app下的build.gradle文件:

Android中Java调用C/C++Android中Java调用C/C++

·其中moduleName是随便写的,与将来在Java类中使用System.loadLobrary(“本地库名称”);以及生成的.so文件名称对应;

·ldLibs是要用到的jni库,一般由google提供,比如上边引入的log库可以让我们在C代码中使用LogCat日志;

·abiFilters指的是我们要生成哪些平台的so文件,这里生成arm平台和x86平台;

修改后,进行sync时,会报错

Android中Java调用C/C++Android中Java调用C/C++

解决办法是,在gradle.properties中添加一行,如图:

Android中Java调用C/C++Android中Java调用C/C++

·这句的作用是允许我们使用已经过时的NDK版本,不知道AndroidStudio要求使用哪个版本的NDK才不会报错,总之只要配置了这一句就可以使用比较旧的NDK版本了。

 

接下来的工作是,编写Native代码:

⑧  在jni目录下新建一个.c或者.cpp文件。

Android中Java调用C/C++Android中Java调用C/C++

内部代码为:

Android中Java调用C/C++Android中Java调用C/C++

此外还应新建一个空的.c文件,否则会报错,这应该是自身的bug.

然后执行build->rebuild project,生成.so文件

Android中Java调用C/C++

 Android中Java调用C/C++Android中Java调用C/C++

⑨  运行app,完成。