从零开始NDK(二)

2014年12月10日

如何编写JNI中的C/C++部分代码

书接上篇。NDK的示例程序Hello-JNI已经可以成功运行了,那么如果我想修改其中的C/C++代码的话,如何操作呢?

打开工程-jni文件夹,这里存放的是JNI部分的代码。如图所示:

其中后缀名为.cpp的文件为JNI的C/C++部分代码。Android.mk文件是安卓的编译规则文件,类似于Linux中的Makefile文件。Application.mk文件的目的是描述在你的应用程序中所需要的模块(即静态库或动态库)。

先来看Android.mk文件:

这里有两个比较关键的变量:LOCAL_MODULE以及LOCAL_SRC_FILES

LOCAL_MODULE定义了要生成的库的名字,对应于JAVA代码中的

System.loadLibrary("hello-jni");

LOCAL_SRC_FILES记录了要编译的C/C++文件,可以用多个,两个文件名中间用“\”相隔,并换行:

LOCAL_SRC_FILES := hello-jni.cpp\
HelloJni.cpp

关于Android.mk文件的其他部分以及Application.mk文件的作用博主没有全部了解,遇到问题时再学习吧。

NDK编程时容易遇到的问题及解决办法

关于没有包含jni.h头文件的错误

接下来我们打开hello-jni.cpp文件,会发现提示有很多错误:

这是因为导入工程的时候没有配置jni头文件的路径。

右键工程-properties-C/C++ general-Paths and Symbols-include选项卡,languages选择c,cpp,点击add并选择对应的jni.h所在路径,位置在NDK路径/platform/android-19/arch-arm/usr/include,这里的android版本最好与当前的SDK版本相对应,如图所示:

ok,错误消除。

关于工程路径改变时CDT报错

当我们工程的路径改变时,打开jni文件夹下的源代码,又会提示类似上面的错误。这是因为工程路径改变时,需要重新配置工程的NDK,也就是重新Add Native Support,但是此时我们发现工程右键的选项里已经没有Add Native Support的选项了,如何解决呢?

找到工程目录下的.project文件,编辑之,把带有cdt字样的标签全部删除,其中buildSpec标签内有两个带有cdt的子标签,natures标签内有四个带有cdt的子标签:

<buildCommand>
	<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
	<triggers>clean,full,incremental,</triggers>
	<arguments>
	</arguments>
</buildCommand>
<buildCommand>
	<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
	<triggers>full,incremental,</triggers>
	<arguments>
	</arguments>
</buildCommand>
<nature>org.eclipse.cdt.core.cnature</nature>
<nature>org.eclipse.cdt.core.ccnature</nature>
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>

之后删除工程文件下的.cproject文件,重启eclipse。

再按照从零开始NDK(一)中的方法,重新Add Native Support,错误消除。

测试

至此,C/C++源代码不再提示错误,我们修改一下返回的字符串,做一下测试:

return env->NewStringUTF("Hello from Simon !  Compiled with ABI " ABI ".");

运行结果如图所示:

运行成功。

未完待续