Android - 动态加载没有确切路径的系统库?

时间:2016-01-27 00:37:21

标签: java android shared-libraries

几个月前,我从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库的其他名称?

我觉得我必须误解这篇文章。当然,加载共享系统库必须有比这更好的方法吗?

1 个答案:

答案 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。有些设备可以,但是它没有通用的库。我重新考虑采用这条路线,如果你遵循它,你将只会使用一部分设备,而且你将不得不为每一代新手添加黑客。