Android - 在没有确切路径的情况下动态加载系统库?
Android - Dynamically load system library without exact path?
几个月前,我从 Android 样本毕业到与工作相关的项目。因此,我对这个构建系统仍然很陌生,并且完全承认我对所有 *.mk 文件和 Android 相关的东西缺乏经验。
我有一个依赖于 OpenCL v1 或更高版本的库。加载会延迟到需要功能时,并且只有在支持最低版本的 OpenCL 时才会加载。直到几天前,每当我尝试加载它时,我都会收到一个 java.lang.UnsatisfiedLinkError
,因为找不到 libGLES_mali.so
。显然我的同事测试的设备有这个文件,而我的设备没有。我发现我的测试中确实存在其他 GLES 库 phone 但我加载它们的代码......比我想象的要长。
尝试使用 System.loadLibrary("GLES")
没有成功,也没有类似的结果。
根据此站点 (http://www.2net.co.uk/tutorial/android-egl-cgf-is-dead),我需要尝试从 system/lib/
和 system/lib/egl/
中加载我能想到的每个 GLES 库。因此,目前我加载这个库的代码如下:
boolean bGles = false;
if(!bGles) {
try {
System.load("system/lib/egl/libGLES.so");
bGles = true;
} catch (java.lang.UnsatisfiedLinkError e) {
}
}
if(!bGles) {
try {
System.load("system/lib/libGLES.so");
bGles = true;
} catch (java.lang.UnsatisfiedLinkError e) {
}
}
if(!bGles) {
try {
System.load("system/lib/egl/libGLES_android.so");
bGles = true;
} catch (java.lang.UnsatisfiedLinkError e) {
}
}
if(!bGles) {
try {
System.load("system/lib/libGLESv1_CM.so");
bGles = true;
} catch (java.lang.UnsatisfiedLinkError e) {
}
}
if(!bGles) {
try {
System.load("system/lib/egl/libGLESv1_CM.so");
bGles = true;
} catch (java.lang.UnsatisfiedLinkError e) {
}
}
太乱了!没有办法要求 Android 加载系统上默认的 'GLES' 吗?默认版本号?我无法完全完成教程,因为我所有的库现在都可以正确加载和运行,但是我将如何处理其他设备?他们的 GLES 库使用 其他 名称?
我觉得我一定是对文章有误解。当然,必须有比这更好的加载共享系统库的方法?
首先,有更好的方法来完成您正在做的事情
String libraries[] = {"name1","name2",...}
boolean success = false;
for(String library : libraries) {
try{
System.load(library);
success = true;
break;
}
catch(UnsatisfiedLinkError) {}
}
if(!success) {
//Handle the failed all case
}
其次 - 您认为您为什么需要首先这样做?为什么不使用内置的 OpenGL 功能和 Java 类?否则,您的应用可能会在设备之间严重损坏。编辑:好的,我现在注意到 OpenCL 并进行了一些挖掘。 Android 不支持 OpenCL。有些设备可以,但没有通用库。我会重新考虑走这条路,如果你真的遵循它,你将只能在设备的一个子集上工作,而且你将不得不为每一代添加黑客。
几个月前,我从 Android 样本毕业到与工作相关的项目。因此,我对这个构建系统仍然很陌生,并且完全承认我对所有 *.mk 文件和 Android 相关的东西缺乏经验。
我有一个依赖于 OpenCL v1 或更高版本的库。加载会延迟到需要功能时,并且只有在支持最低版本的 OpenCL 时才会加载。直到几天前,每当我尝试加载它时,我都会收到一个 java.lang.UnsatisfiedLinkError
,因为找不到 libGLES_mali.so
。显然我的同事测试的设备有这个文件,而我的设备没有。我发现我的测试中确实存在其他 GLES 库 phone 但我加载它们的代码......比我想象的要长。
尝试使用 System.loadLibrary("GLES")
没有成功,也没有类似的结果。
根据此站点 (http://www.2net.co.uk/tutorial/android-egl-cgf-is-dead),我需要尝试从 system/lib/
和 system/lib/egl/
中加载我能想到的每个 GLES 库。因此,目前我加载这个库的代码如下:
boolean bGles = false;
if(!bGles) {
try {
System.load("system/lib/egl/libGLES.so");
bGles = true;
} catch (java.lang.UnsatisfiedLinkError e) {
}
}
if(!bGles) {
try {
System.load("system/lib/libGLES.so");
bGles = true;
} catch (java.lang.UnsatisfiedLinkError e) {
}
}
if(!bGles) {
try {
System.load("system/lib/egl/libGLES_android.so");
bGles = true;
} catch (java.lang.UnsatisfiedLinkError e) {
}
}
if(!bGles) {
try {
System.load("system/lib/libGLESv1_CM.so");
bGles = true;
} catch (java.lang.UnsatisfiedLinkError e) {
}
}
if(!bGles) {
try {
System.load("system/lib/egl/libGLESv1_CM.so");
bGles = true;
} catch (java.lang.UnsatisfiedLinkError e) {
}
}
太乱了!没有办法要求 Android 加载系统上默认的 'GLES' 吗?默认版本号?我无法完全完成教程,因为我所有的库现在都可以正确加载和运行,但是我将如何处理其他设备?他们的 GLES 库使用 其他 名称?
我觉得我一定是对文章有误解。当然,必须有比这更好的加载共享系统库的方法?
首先,有更好的方法来完成您正在做的事情
String libraries[] = {"name1","name2",...}
boolean success = false;
for(String library : libraries) {
try{
System.load(library);
success = true;
break;
}
catch(UnsatisfiedLinkError) {}
}
if(!success) {
//Handle the failed all case
}
其次 - 您认为您为什么需要首先这样做?为什么不使用内置的 OpenGL 功能和 Java 类?否则,您的应用可能会在设备之间严重损坏。编辑:好的,我现在注意到 OpenCL 并进行了一些挖掘。 Android 不支持 OpenCL。有些设备可以,但没有通用库。我会重新考虑走这条路,如果你真的遵循它,你将只能在设备的一个子集上工作,而且你将不得不为每一代添加黑客。