问题:
使用android-ndk编译android 动态库,编译无问题,运行在低版本Android系统(如:android 4.4.4)报
java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "srand" referenced by "name.so"...
java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "rand" referenced by "name.so"...
java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "strtof" referenced by "name.so"...
java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "stderr" referenced by "name.so"...
原因分析:
standalone-toolchain-x86/sysroot/usr/lib/libc.so 与 usr/local/standalone-toolchain-x86/sysroot/usr/include里面头文件定义的函数对应不上,include头文件多定义了,srand,rand,strtof在stdlib.h;stderr在stdio.h中
android-ndk-r14b/platforms/android-14/arch-x86/usr/include/的头文件里面定义的srand、rand等函数才和usr/local/standalone-toolchain-x86/sysroot/usr/lib/libc.so里面实际导出的函数对应的上
另外还有在standalone-toolchain-x86/sysroot/usr/include/android/api-level.h,如果是使用android-ndk-r15c或以上版本生成的,其中__ANDROID_API__的值是10000,导致编译出的离线内核依赖的库实际在对应系统版本中的libc.so中未实现,然后报错
解决办法:
使用android-ndk-r14b版本ndk生成standalone-tool,生成命令: sudo python make_standalone_toolchain.py --arch x86 --api 16 --stl gnustl -v --install-dir /path/standalone-toolchain-x86,然后再编译离线静态库