您的位置:首页 > 移动开发 > Android开发

NDK编译中的一些问题记录

2016-01-01 17:31 309 查看
1.在任意目录下编译Android.mk

一般情况下,我们只会在Android项目的根目录或者jni目录下执行ndk-build来生成so库,如果需要在任何目录下执行ndk-build,则需要指定一些参数,如下:

ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk NDK_APPLICATION_MK=./Application.mk NDK_MODULE_PATH=../../../../external -B

2.编译报错找不到gl2

需要在Application.mk中指定SDK版本,如下:

APP_PLATFORM := android-9

3.导出so里面的函数

当我们编译出了so后,调用这个so时发现有些方法找不到,可以查看so文件是否包含这个函数符号,命令如下:

dumpobj -tT libcocos2d.so | grep

4.将符号转为函数名

找到了函数符号,可以使用如下命令找到对应的函数:

c++filt

5.编译找不到__android_log_print

Application.mk加上LOCAL_LDLIBS := -llog

6.取消编译优化

在将静态库编译进动态库时,默认情况下,因为编译优化,静态库中一些没有被调用的函数不会被编译进动态库,如果想把静态库完全编译进去可以标签来添加静态库:

LOCAL_WHOLE_STATIC_LIBRARIES

7.需要链接的系统默认库

LOCAL_LDLIBS := -lGLESv2 \

-lEGL \

-llog \

-lz

8.函数定义后面加上attribute((weak))

将本模块的func转成弱符号类型,如果遇到强符号类型(即外部模块定义了func),那么我们在本模块执行的func将会是外部模块定义的func。

如果外部模块没有定义,那么,将会调用这个弱符号,也就是在本地定义的func,直接返回了一个1(返回值视具体情况而定)相当于增加了一个默认函数。

原理:连接器发现同时存在弱符号和强符号,有限选择强符号,如果发现不存在强符号,只存在弱符号,则选择弱符号。如果都不存在:静态链接,恭喜,编译时报错,动态链接:对不起,系统无法启动。

可以参考如下链接:

http://blog.csdn.net/mrpre/article/details/23097869

9.JNI_OnLoad

如果so中实现了此方法,则在调用System.loadLibrary时会调用此方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ndk android