几个月前,我从Android样本毕业到与工作相关的项目。因此,我仍然对这个构建系统很新,并且完全承认我对* .mk文件和Android相关的所有东西缺乏经验。
我有一个依赖于OpenCL v1或更高版本的库。加载会延迟,直到需要功能,并且仅在支持最低版本的OpenCL时才会加载。直到几天前,每当我尝试加载它时都会收到java.lang.UnsatisfiedLinkError
,因为无法找到libGLES_mali.so
。显然我的同事测试的设备有这个文件,而我的设备没有。我发现我的测试手机上确实存在其他GLES库,但我加载它们的代码比我想象的要长。
尝试使用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库的其他名称?
我觉得我必须误解这篇文章。当然,加载共享系统库必须有比这更好的方法吗?
答案 0 :(得分:2)
首先,有更好的方法来做你正在做的事情
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。有些设备可以,但是它没有通用的库。我重新考虑采用这条路线,如果你遵循它,你将只会使用一部分设备,而且你将不得不为每一代新手添加黑客。