如何编写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 ".");
运行结果如图所示:
运行成功。