问题:
NDK编译的so库libA.so调用了libB.so。
报错提示:(手机MX3,非root)
1)日志生成不了。
2)函数初始化崩溃。
3)某函数调用崩溃。
经分析原因如下:
1)未创建日志文件所在的目录,导致写失败。
2)非root下,需要实现调用libgnustl_shared.so,否则报错;root后的手机,不存在此问题。
3)非root下,pthread_kill第一个参数线程ID不可以为0,否则崩溃;root后的手机,不存在此问题。
解决问题,需要做的一些准备:
1 如何真机调试一个Android程序
步骤:
1 下载手机的驱动,让电脑连接上手机
2 手机要开启USB调试模式
3 写个demp apk联机调试
2 如何往手机上移动文件
1 利用豌豆荚等工具(不建议)
2 使用adb命令
adb kill-server
adb start-server
adb devices 列出设备,看看是否有设备
adb shell 进入shell模式
adb push && adb pull 实现文件移动
3 如何查看设备信息
system_profiler SPUSBDataType
M356:Product ID: 0x4e26Vendor ID: 0x18d1 (Google Inc.)Version: 2.33Serial Number: 356BCHSN2EKJSpeed: Up to 480 Mb/secManufacturer: MEIZULocation ID: 0x14241000 / 25Current Available (mA): 500Current Required (mA): 2
4 Android Studio调用NDK动态库失败,提示找不着,Eclipse则可以
原因:
so文件+引用头文件;
比Eclipse多一步,需要配置build.gradle。Eclipse 调用动态库成功,出现问题
直接在libs下放置动态库即可。sourceSets {main {jniLibs.srcDirs = ['libs']}}
否则找不到对应的动态库。
5 Android Studio 调用NDK库写文件失败,提示权限不对
manifest中配置的权限android.permission.WRITE_EXTERNAL_STORAGE
尤其要注意位置,和Application的相对位置。否则无效。
6 思路
一般打日志,出错的地方,打印出原因码,诸如dlerror等方法的使用
7 过程中,遇到的一些疑问,还未来地及搞明白,先记录下来
1 是否一定要静态链接编译,LOCAL_SHARED_LIBRARIES :=
2 Android.mk用途,能仅仅编译so库吗
3 NDK要调用三方库,如何编写Android.mk
4 确认dlopen失败原因码(提示找不到libgnustl_shared.so)
5 Application.mk又做何用
6 APP_STL这个值很有用,通过首先加载libgnustl,规避掉问题