无法在 4.2 4.3 上加载本机库,但在最新版本上加载
Unable to load native library on 4.2 4.3 but loads on recent versions
我有一个本机 android 应用程序(NativeActivity
,没有 java 代码,但只有 libMyApp.so
本机库)
该应用程序在 Android 5.0.1 和 5.1.1 上运行完美,但在 android 4.3 和 4.2.2
上崩溃
对于 5.0.1 和 5.1.1 版本,从
成功加载 .so
库
/data/data/com.example.myapp/lib/libMyApp.so
4.3 和 4.2.2 版本尝试从以下位置之一加载
/data/app-lib/com.example.myapp-1/libMyApp.so
/data/app-lib/com.example.myapp-2/libMyApp.so
错误信息是
FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myapp/android.app.NativeActivity}: java.lang.IllegalArgumentException: Unable to load native library: /data/app-lib/com.example.myapp-2/libMyApp.so
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2295)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2349)
at android.app.ActivityThread.access0(ActivityThread.java:159)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:176)
at android.app.ActivityThread.main(ActivityThread.java:5419)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
at dalvik.system.NativeStart.main(Native Method
我的应用程序只有一个共享库,即不依赖于第三方库。
模块名称在清单文件中是这样指定的
<meta-data android:name="android.app.lib_name"
android:value="MyApp" />
libMyApp.so
与 -llog -lGLESv3 -lGLESv2 -lGLESv1_CM -lEGL -landroid -lz
库链接。
为什么无法加载库,我缺少什么?
为什么旧 android 版本无法从 /data/data/com.example.myapp/lib/
加载?!
较旧的 android 版本是否有其他模块命名约定?
你有没有像这样在 class 中加载你的库?
static {
System.loadLibrary("nativeLib");
}
经过2天的研究,我终于找到了问题的根源。
首先,Native App 在 logcat 中不显示完整的链接器错误 -(我不知道为什么!)
但是在将同一个应用程序转换为 Java/JNI 应用程序之后,我只能在 L (5.*) 之前的 Android 版本上看到以下链接器错误。
dlopen("/data/app-lib/com.example.myapp/libMyApp.so") failed: dlopen
failed: cannot locate symbol "srand" referenced by "libMyApp.so"...
我以前用 android-21 api 级别从 r10e ndk 编译 cpp 代码。
这基本上不能保证该应用程序 运行 在 L 之前的 android 版本上正常。
这里是官方androidbug report.
由于在我的原生应用中使用了 OGLES3.1
功能,我无法将目标 SDK 级别从 21 降级,所以我别无选择,只能将最低 sdk 级别更新为 21。
我有一个本机 android 应用程序(NativeActivity
,没有 java 代码,但只有 libMyApp.so
本机库)
该应用程序在 Android 5.0.1 和 5.1.1 上运行完美,但在 android 4.3 和 4.2.2
上崩溃对于 5.0.1 和 5.1.1 版本,从
成功加载.so
库
/data/data/com.example.myapp/lib/libMyApp.so
4.3 和 4.2.2 版本尝试从以下位置之一加载
/data/app-lib/com.example.myapp-1/libMyApp.so
/data/app-lib/com.example.myapp-2/libMyApp.so
错误信息是
FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myapp/android.app.NativeActivity}: java.lang.IllegalArgumentException: Unable to load native library: /data/app-lib/com.example.myapp-2/libMyApp.so
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2295)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2349)
at android.app.ActivityThread.access0(ActivityThread.java:159)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:176)
at android.app.ActivityThread.main(ActivityThread.java:5419)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
at dalvik.system.NativeStart.main(Native Method
我的应用程序只有一个共享库,即不依赖于第三方库。
模块名称在清单文件中是这样指定的
<meta-data android:name="android.app.lib_name"
android:value="MyApp" />
libMyApp.so
与 -llog -lGLESv3 -lGLESv2 -lGLESv1_CM -lEGL -landroid -lz
库链接。
为什么无法加载库,我缺少什么?
为什么旧 android 版本无法从 /data/data/com.example.myapp/lib/
加载?!
较旧的 android 版本是否有其他模块命名约定?
你有没有像这样在 class 中加载你的库?
static {
System.loadLibrary("nativeLib");
}
经过2天的研究,我终于找到了问题的根源。
首先,Native App 在 logcat 中不显示完整的链接器错误 -(我不知道为什么!)
但是在将同一个应用程序转换为 Java/JNI 应用程序之后,我只能在 L (5.*) 之前的 Android 版本上看到以下链接器错误。
dlopen("/data/app-lib/com.example.myapp/libMyApp.so") failed: dlopen failed: cannot locate symbol "srand" referenced by "libMyApp.so"...
我以前用 android-21 api 级别从 r10e ndk 编译 cpp 代码。
这基本上不能保证该应用程序 运行 在 L 之前的 android 版本上正常。
这里是官方androidbug report.
由于在我的原生应用中使用了 OGLES3.1
功能,我无法将目标 SDK 级别从 21 降级,所以我别无选择,只能将最低 sdk 级别更新为 21。