2016-01-27 29 views
0

几个月前,我从Android样本毕业到与工作有关的项目。因此,我仍然对这个构建系统非常痛苦,并且完全承认我对所有* .mk文件和Android相关的缺乏经验。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库?

我觉得我一定是误解了文章。当然,加载共享系统库比这个更好吗?

回答

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 
} 

Secondly-为什么你认为你需要做到这一点,开始用?你为什么不在OpenGL功能和Java类中使用构建?如果你不是,你的应用程序可能会在设备之间崩溃。编辑:好吧,我现在注意到OpenCL并做了一些挖掘。 Android不支持OpenCL。有些设备可以,但是没有通用的库。我会重新考虑走这条路,如果你遵循它,你将只能使用一部分设备,并且你将不得不为每个新一代添加黑客。

+0

感谢您的回复。几个月前,我得到了这个项目,直到一个星期前,才对GUI进行了一些修改。所以要回答'为什么',我只能说'为了避免例外'。我延迟加载的本地库会抛出一个异常,如果我*不*显式加载GLES库。我真的不知道任何已经存在的OpenGL功能,但我们的应用程序必须绝对使用依赖于GLES的本机库。 –

+1

听起来像你被放在一种低劣的位置。 Google在2013年表示他们没有计划支持OpenCL,他们似乎也没有改变立场。当然,OpenGL是支持和内置的。如果你使用设备级别的黑客,你可以在一些但不是所有的设备上获得CL。我认为你最好的选择是寻找一个能够随时了解你需要的黑客的图书馆,但目前我还不知道。您可能需要了解OpenCL需要什么,以及是否可以长期重构您的项目。 –