实现jni中遇到的问题

之前,记录了实现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中)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值