gnustl静态还是动态

您好,我的工程里有一些第三方so是用gnustl_shared编译生成的,但是CocosCreator工程的Application.mk中用的是gnustl_static,我可以改成gnustl_shared吗?

我试着改了,也可以正常运行,但是怕有什么隐患或者不稳定,另外以后接AnySDK的时候,也可以用gnustl_shared吗?

谢谢!

最好是用静态库,这样gnustl的实现会打包到游戏最终的so里面。
如果是用动态库,系统如果缺少gnustl_shared.so或者版本不对就麻烦了。

谢谢您回复的如此迅速!

我这边的第三方so库用的是动态的gnustl_shared不太好改成静态的,如果我将NDK的r10e版本的gnustl_shared拷到jni下,在Android.mk中写明:
LOCAL_SHARED_LIBRARIES := gnustl_shared

这样用特定的gunstl版本,是否可以避免缺少该库或者版本不对的问题呢?

谢谢。

嗯,应该可以,但是你程序启动的时候需要通过System.loadLibrary(“gnustl_shared”);来加载你放到libs目录下的这个动态库。
这样应该是可以不使用系统的了。

遇到了个小坑,记录一下,以便给他人提示。

改成LOCAL_SHARED_LIBRARIES := gnustl_shared之后,每次都会从NDK中拷贝gnustl_shared,并不能用prebuild目录下自己指定的gnustl_shared.so文件,即使用PREBUILT_SHARED_LIBRARY来拷贝prebuild目录下的gnustl_shared也无效。
如:libgnustl_shared.so <= /sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi/

所以只好要求所有开发人员统一安装r9c或者r10e的NDK版本啦。

另外一开始我没有加System.loadLibrary(“gnustl_shared”),在Android5.0和6.0的设备上都没问题,但是用红米1测试的时候,因为是Android4.2.1,结果报如下错误:

E/dalvikvm(12110): dlopen("/data/app-lib/org.cocos2d.helloworld-1/libcocos2djs.so") failed: Cannot load library: soinfo_relocate(linker.cpp:975): cannot locate symbol “_ZNKSt8__detail20_Prime_rehash_policy14_M_need_rehashEjjj” referenced by “libcocos2djs.so”…
D/AndroidRuntime(12110): Shutting down VM
D/skia ( 857): Flag is not 10
W/dalvikvm(12110): threadid=1: thread exiting with uncaught exception (group=0x419989a8)
W/Trace ( 7031): Unexpected value from nativeGetEnabledTags: 0
D/skia ( 857): Flag is not 10
E/AndroidRuntime(12110): FATAL EXCEPTION: main
E/AndroidRuntime(12110): java.lang.UnsatisfiedLinkError: Cannot load library: soinfo_relocate(linker.cpp:975): cannot locate symbol “_ZNKSt8__detail20_Prime_rehash_policy14_M_need_rehashEjjj” referenced by “libcocos2djs.so”…
E/AndroidRuntime(12110): at java.lang.Runtime.loadLibrary(Runtime.java:365)
E/AndroidRuntime(12110): at java.lang.System.loadLibrary(System.java:514)
E/AndroidRuntime(12110): at org.cocos2dx.lib.Cocos2dxActivity.onLoadNativeLibraries(Cocos2dxActivity.java:252)
E/AndroidRuntime(12110): at org.cocos2dx.lib.Cocos2dxActivity.onCreate(Cocos2dxActivity.java:268)
E/AndroidRuntime(12110): at org.cocos2dx.javascript.AppActivity.onCreate(AppActivity.java:40)
E/AndroidRuntime(12110): at android.app.Activity.performCreate(Activity.java:5224)
E/AndroidRuntime(12110): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1081)
E/AndroidRuntime(12110): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2297)
E/AndroidRuntime(12110): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2385)
E/AndroidRuntime(12110): at android.app.ActivityThread.access$600(ActivityThread.java:157)
E/AndroidRuntime(12110): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1341)
E/AndroidRuntime(12110): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(12110): at android.os.Looper.loop(Looper.java:153)
E/AndroidRuntime(12110): at android.app.ActivityThread.main(ActivityThread.java:5349)
E/AndroidRuntime(12110): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(12110): at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(12110): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:848)
E/AndroidRuntime(12110): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:615)
E/AndroidRuntime(12110): at dalvik.system.NativeStart.main(Native Method)

google了好半天,什么gcc版本不一致,ndk版本过高啥的,都不能解决。最后加了System.loadLibrary(“gnustl_shared”)才解决,多谢啦!!

1赞