之前,记录了实现jni的过程——android studio中实现jni开发
实现过程并不是一帆风顺的,这里记录一下遇到的问题。
1、Ndk-build时
错误提示:“parameter name omitted”。
大意是“参数名被忽略”。
头文件中函数声明参数列表中只有参数类型,没有参数名。而我们是直接复制头文件的内容,所以这里应该添加参数名。如下所示:
然后继续执行ndk-build
可以看到,在libs目录下已经生成了so文件。证明编译已经ok了。
2、编写Android.mk文件
》LOCAL_MODULE := sec_fleet
用于声明编译的模块,可以自定义名字,名称必须唯一且不含任何空格
Build System在生成最终共享库文件时,会将"lib"作为前缀+模块名称+".so"作为共享库文件名称;
如:libsec_fleet.so
》LOCAL_SRC_FILES
此变量必须包含要构建到模块中的C/C++源文件列表,不需要列出头文件和包含文件,系统会自动导入依赖。
此变量包含构建共享库或可执行文件时链接库,使用-l前缀传递特定系统库的名称,多个链接库之间使用空格作为分隔符;
NDK为Android版本提供新的头文件和库,文件路径:$NDK/platforms/android-<level>/<abi>/usr/include下;
-llog链接到系统的liblog.so文件,应用可以定义从原生代码向内核发送日志消息,路径:/system/lib/liblog.so,其实是导入<android/log.h>头文件,路径:$NDK/platforms/android-3/arch-arm/usr/include/android/log.h
变量列表:
-llog(日志库):导入log.h头文件
-lz(ZLib压缩库):添加zlib.h和zconf.h头文件;
-ldl(动态链接器库):添加dlfcn.h头文件,可以访问Android动态链接器的dlopen()、dlsym()和dlclose()函数;
3、Application.mk文件
APP_MODULES := sec_fleet
APP_MODULES:默认情况下,Android NDK构建系统 构建Android.mk文件声明的所有模块。
该变量可以提供一个空格分开的,需要被构建的模块列表
4、在c文件中打印日志
打印日志声明如下:
结果一直打印的地方一直报错。
解决:
一定要在在Android.mk中加入
LOCAL_LDLIBS := -llog
5、把其他项目中用到的jni文件复制到当前项目的module下,编译时报错
C:\Users\Administrator\AppData\Local\Android\Sdk\ndk-bundle\build\ndk-build.cmd
Android NDK: APP_PLATFORM not set. Defaulting to minimum supported version android-16.
C:/Users/Administrator/AppData/Local/Android/Sdk/ndk-bundle/build//../build/core/add-application.mk:88: *** Android NDK: Aborting... . Stop.
Android NDK: WARNING: APP_PLATFORM android-16 is higher than android:minSdkVersion 1 in ./AndroidManifest.xml. NDK binaries will *not* be compatible with devices older than android-16. See https://android.googlesource.com/platform/ndk/+/master/docs/user/common_problems.md for more information.
Android NDK: Your APP_BUILD_SCRIPT points to an unknown file: ./jni/Android.mk
很明显,是路径找不到的问题。
因为之前配置的ndk-build命令,我们指定的WorkDirctory为workspace所在的路径——$ProjectFileDir$\app\src\main
而我们当前是放在module中的,所以路径也就变成了
F:\project\work\AppFleet_Android\httplibrary\src\main\jni
区别原来的:F:\project\work\AppFleet_Android\app\src\main\jni
怎么办呢?
那就在dos窗口中使用命令行来编译好了,如下:
切换到对应的路径下,使用ndk-build命令,前提是在环境变量中配置了NDK_HOME,
然后,如上图所示,编译成功了。
回到android studio中,可以看到如下:
已经生成了需要的so文件。
6、接着5,编译好so之后,接着运行项目,遇到问题:
意思:您的项目包含C++文件,但它没有使用受支持的native编译系统。
解决办法:
在当前module的build.gradle中加入如下配置即可。(这个配置也可以放在defaultConfig中)。