keb*_*ari 1 c++ java eclipse android android-ndk
我一直在争取在Android上使用Cpp程序几天,我遇到了一个我认为可能是个bug的问题.我正在使用SDL2,但没有其他库,我也在使用SDL android项目模板.
基本程序运行正常,但我想使用Cpp stdlibs和STL,所以根据说明,我将APP_STL:= stlport_static添加到Application.mk并重建程序但是此后应用程序只显示一个空白屏幕一段时间然后崩溃,调试说如下:
01-20 22:10:14.817: D/dalvikvm(26097): Trying to load lib /data/data/com.kebabkeisari.peli/lib/libSDL2.so 0x41d06890
01-20 22:10:14.817: W/dalvikvm(26097): Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lorg/libsdl/app/SDLActivity;
01-20 22:10:14.817: W/dalvikvm(26097): Class init failed in newInstance call (Lcom/kebabkeisari/peli/Ribale;)
01-20 22:10:14.822: D/AndroidRuntime(26097): Shutting down VM
01-20 22:10:14.822: W/dalvikvm(26097): threadid=1: thread exiting with uncaught exception (group=0x4109f2a0)
01-20 22:10:14.827: E/AndroidRuntime(26097): FATAL EXCEPTION: main
01-20 22:10:14.827: E/AndroidRuntime(26097): java.lang.ExceptionInInitializerError
01-20 22:10:14.827: E/AndroidRuntime(26097): at java.lang.Class.newInstanceImpl(Native Method)
01-20 22:10:14.827: E/AndroidRuntime(26097): at java.lang.Class.newInstance(Class.java:1319)
01-20 22:10:14.827: E/AndroidRuntime(26097): at android.app.Instrumentation.newActivity(Instrumentation.java:1057)
01-20 22:10:14.827: E/AndroidRuntime(26097): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2015)
01-20 22:10:14.827: E/AndroidRuntime(26097): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2125)
01-20 22:10:14.827: E/AndroidRuntime(26097): at android.app.ActivityThread.access$600(ActivityThread.java:140)
01-20 22:10:14.827: E/AndroidRuntime(26097): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1227)
01-20 22:10:14.827: E/AndroidRuntime(26097): at android.os.Handler.dispatchMessage(Handler.java:99)
01-20 22:10:14.827: E/AndroidRuntime(26097): at android.os.Looper.loop(Looper.java:137)
01-20 22:10:14.827: E/AndroidRuntime(26097): at android.app.ActivityThread.main(ActivityThread.java:4898)
01-20 22:10:14.827: E/AndroidRuntime(26097): at java.lang.reflect.Method.invokeNative(Native Method)
01-20 22:10:14.827: E/AndroidRuntime(26097): at java.lang.reflect.Method.invoke(Method.java:511)
01-20 22:10:14.827: E/AndroidRuntime(26097): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
01-20 22:10:14.827: E/AndroidRuntime(26097): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
01-20 22:10:14.827: E/AndroidRuntime(26097): at dalvik.system.NativeStart.main(Native Method)
01-20 22:10:14.827: E/AndroidRuntime(26097): Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1307]: 1951 cannot locate 'signal'...
01-20 22:10:14.827: E/AndroidRuntime(26097): at java.lang.Runtime.loadLibrary(Runtime.java:370)
01-20 22:10:14.827: E/AndroidRuntime(26097): at java.lang.System.loadLibrary(System.java:535)
01-20 22:10:14.827: E/AndroidRuntime(26097): at org.libsdl.app.SDLActivity.<clinit>(SDLActivity.java:49)
01-20 22:10:14.827: E/AndroidRuntime(26097): ... 15 more
Run Code Online (Sandbox Code Playgroud)
因此程序在运行时失败.STL是罪魁祸首,是的,我尝试过gnustl和其他人,但同样的问题也出现了.
我正在使用ndk-build和Eclipse,在三星Galaxy S3上运行应用程序.
我在网上搜索,确实有很多类似的问题,其中一个地方据说没有同时建成armeabi和armeabi-v7,但这并没有帮助.
这似乎与许多其他最近的问题相同,例如无法加载库:reloc_library [1285]:找不到'rand'.问题是您正在使用android-21API 构建应用程序.的signal功能(就像rand以前是在报头中的内联函数)(重定向代码,以bsd_signal及lrand48分别地),但在android-21新的功能添加,所以这些都不再在报头内联.
因此,如果你希望你的应用程序的平台上早于上运行android-21,你需要确保你建立一个使用你希望你的代码在运行的最低API级别的本地代码,例如,通过增加APP_PLATFORM := android-9在jni/Application.mk.
如果你需要更新的功能,android-19也应该工作得非常好.对于21之前的版本,较新的平台版本只添加了之前不存在的新函数(但旧函数表现得像以前一样),所以如果你只使用android-N中存在的函数,它应该适用于android-N即使你建造它android-19(N <19).但是21改变了所有这一切,之前存在的功能(但重定向到其他功能)现在链接到一个不同的名称(更诚实的一个),这在以前是不可用的.
但是,这不会影响您可以构建Java代码(如果有)的API级别 - 如果您愿意,您仍然可以构建针对最新API的部分.