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时会调用此方法。
一般情况下,我们只会在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时会调用此方法。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories