我们正在体验java.lang.UnsatisfiedLinkError一些在市场上使用我们的应用程序的Android手机.
问题描述:
static
{
System.loadLibrary("stlport_shared"); // C++ STL
System.loadLibrary("lib2");
System.loadLibrary("lib3");
}
Run Code Online (Sandbox Code Playgroud)
System.loadLibrary()使用a 使应用程序崩溃java.lang.UnsatisfiedLinkError.
java.lang.UnsatisfiedLinkError: Couldn't load stlport_shared from loader dalvik.system.PathClassLoader[dexPath=/data/app/app_id-2.apk,libraryPath=/data/app-lib/app_id-2]: findLibrary returned null
解决方法
我们开始在所有安装上运行一些自定义诊断程序,以检查/data/data/app_id/lib文件夹中是否已解压缩每个lib .
PackageManager m = context.getPackageManager();
String s = context.getPackageName();
PackageInfo p;
p = m.getPackageInfo(s, 0);
s = p.applicationInfo.dataDir;
File appDir = new File(s);
long freeSpace = appDir.getFreeSpace();
File[] appDirList = appDir.listFiles();
int numberOfLibFiles = 0;
boolean subFilesLarger0 = true;
for (int i = 0; i < appDirList.length; i++) …Run Code Online (Sandbox Code Playgroud) java-native-interface android native android-ndk unsatisfiedlinkerror
我正在使用崩溃报告服务跟踪我们的Android应用程序(使用NDK加载C++库)的崩溃.少数用户遇到以下崩溃:
java.lang.UnsatisfiedLinkError: dlopen failed: empty/missing DT_HASH in "cpplibrary.so" (built with --hash-style=gnu?)
at java.lang.Runtime.loadLibrary(Runtime.java:365)
at java.lang.System.loadLibrary(System.java:526)
Run Code Online (Sandbox Code Playgroud)
我可以在互联网上找到的这个错误(例如这个Google Groups帖子)讨论了构建lib的问题,这会导致每次运行应用程序时都会出现此错误.几乎没有关于为什么偶尔会发生这种情况的信息. 这篇文章是我能找到的最接近的帖子.
根据崩溃痕迹,看起来任何特定的用户都会经历这种不断的延伸; 我不确定这些用户是否能够正确加载lib.有没有人对有时可能导致这种情况发生的想法有所了解?我可以以不同的方式进行NDK构建以试图阻止它吗?
谢谢!
编辑:这篇文章提到了有条件地获得这种错误的两种方法; 我会照顾他们.
Edit2:构建文件:Android.mk(摘录):
include $(CLEAR_VARS)
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)
LOCAL_C_INCLUDES := <Source Path>...
LOCAL_CFLAGS := -DANDROID -Wall
LOCAL_CPPFLAGS := -DENABLE_SDK_DEBUGGING=1 -DENABLE_SDK_LOGGING=1
LOCAL_MODULE := cpplibrary
LOCAL_SRC_FILES := <Source Files> / ...
LOCAL_LDLIBS := -llog -landroid
LOCAL_STATIC_LIBRARIES := cpplibrary
include $(BUILD_SHARED_LIBRARY)
Run Code Online (Sandbox Code Playgroud)
Application.mk:
APP_STL := stlport_static
APP_CFLAGS += -std=c++11
Run Code Online (Sandbox Code Playgroud)