Java Android-动态加载系统库而不使用精确路径?

Java Android-动态加载系统库而不使用精确路径?,java,android,shared-libraries,Java,Android,Shared Libraries,几个月前,我从Android示例毕业,开始了与工作相关的项目。因此,我仍然是这个构建系统的新手,完全承认我对所有与*.mk文件和Android相关的东西都缺乏经验 我有一个依赖于OpenCLV1或更高版本的库。只有在支持OpenCL的最低版本时,加载才会延迟,直到需要该功能为止。直到几天前,每当我试图加载java.lang.UnsatifiedLinkError时,我都会收到一个java.lang.UnsatifiedLinkError,因为找不到libGLES_mali.so。显然,我的同事测

几个月前,我从Android示例毕业,开始了与工作相关的项目。因此,我仍然是这个构建系统的新手,完全承认我对所有与*.mk文件和Android相关的东西都缺乏经验

我有一个依赖于OpenCLV1或更高版本的库。只有在支持OpenCL的最低版本时,加载才会延迟,直到需要该功能为止。直到几天前,每当我试图加载java.lang.UnsatifiedLinkError时,我都会收到一个
java.lang.UnsatifiedLinkError
,因为找不到
libGLES_mali.so
。显然,我的同事测试的设备有这个文件,而我的设备没有。我在测试手机上发现了其他GLES LIB,但我加载它们的代码是。。。比我想象的要长

尝试使用
System.loadLibrary(“GLES”)
没有成功,也没有任何类似的结果

根据这个站点()的说法,我需要尝试加载我能想到的每个GLES库的名称,从
system/lib/
system/lib/egl/
两个库中加载。因此,目前我加载此库的代码如下:

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”吗?默认版本号?我无法完全完成本教程,因为我的所有库现在都可以正确加载和运行了,但是对于其他设备我该怎么做呢?还有其他的名字吗


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

首先,有更好的方法来完成您正在做的事情

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。有些设备可以,但没有通用的库。我会重新考虑走这条路,如果你真的这样做,你只会在一部分设备上工作,而且你将不得不为每一代新设备添加黑客。

首先,有一种更好的方法来做你正在做的事情

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。有些设备可以,但没有通用的库。我会重新考虑走这条路,如果你真的这么做,你只会在一部分设备上工作,而且你将不得不为每一代新设备添加黑客。

谢谢你的回复。几个月前我接到了这个项目,直到一周前,我只是对GUI做了一些表面上的修改。所以要回答“为什么”,我只能说“避免例外”。如果我不尝试显式加载GLES库,则延迟加载的本机库会引发异常。我真的不知道OpenGL已经提供了什么功能,但是我们的应用程序必须绝对使用依赖于GLE的本机库。听起来你的处境有点糟糕。谷歌在2013年表示,他们没有支持OpenCL的计划,而且他们似乎也没有改变立场。当然,OpenGL是受支持和内置的。如果你使用的是设备级黑客,你可以在一些但不是所有的设备上获得CL。我认为你最好的选择是寻找一个能跟上你需要的黑客的最新版本的库,但我目前还不知道。您可能想了解什么需要OpenCL,以及它是否可以从您的项目中长期重构。谢谢您的回复。几个月前我接到了这个项目,直到一周前,我只是对GUI做了一些表面上的修改。所以要回答“为什么”,我只能说“避免例外”。如果我不尝试显式加载GLES库,则延迟加载的本机库会引发异常。我真的不知道OpenGL已经提供了什么功能,但是我们的应用程序必须绝对使用依赖于GLE的本机库。听起来你的处境有点糟糕。谷歌在2013年表示,他们没有支持OpenCL的计划,而且他们似乎也没有改变立场。当然,OpenGL是受支持和内置的。如果你使用的是设备级黑客,你可以在一些但不是所有的设备上获得CL。我认为你最好的选择是寻找一个能跟上你需要的黑客的最新版本的库,但我目前还不知道。您可能希望了解什么需要OpenCL,以及它是否可以从您的项目中长期重构。