我正在尝试编写一个使用OpenCL 1.2的短应用程序(不用于分发,因此通用访问不是问题)来进行计算.但是,OpenCL在Android上给我带来了一些麻烦.我的计算机上有libopencl.so文件和AMD SDK的1.2头文件.问题是:我如何正确使用它们?
在gradle(最新版本)构建文件中我指定了这个,或者有人可以推荐一个好地方让我转向阅读这个?或者,理论上我需要理解什么才能让我自己弄清楚 – 正确链接到OpenCL库需要什么?
apply plugin: 'com.android.model.application'
model {
android {
compileSdkVersion = 21
buildToolsVersion ="22.0.1"
defaultConfig.with {
applicationId = "com.example.thing"
minSdkVersion.apiLevel = 14
targetSdkVersion.apiLevel = 14
}
}
/*
* native build settings
*/
android.ndk {
moduleName = "otherThing"
ldLibs += "log"
ldLibs += "android"
//cFlags "~/OpenCL1-2HeaderFiles"
}
android.buildTypes {
release {
isMinifyEnabled = false
proguardFiles += file('proguard-rules.txt')
}
}
android.productFlavors {
create("arm") {
ndk.abiFilters += "armeabi"
}
create("arm7") {
ndk.abiFilters += "armeabi-v7a"
}
create("arm8") {
ndk.abiFilters += "arm64-v8a"
}
create("x86") {
ndk.abiFilters += "x86"
}
create("x86-64") {
ndk.abiFilters += "x86_64"
}
create("mips") {
ndk.abiFilters += "mips"
}
create("mips-64") {
ndk.abiFilters += "mips64"
}
create("all")
}
}
谢谢
解决方法:
这是一个相当复杂的过程.我会尽量保持简洁.
>要在Android上运行您的应用程序,AMD的libopencl.so将无法运行. OpenCL库必须与您的设备兼容.对于Android armv7设备,您需要一个由芯片供应商提供的OpenCL库,并使用armv7工具链进行编译.要在Intel Atom设备上运行,您需要由芯片供应商提供的库,并针对x86_32 arch进行编译.
基本上,对于您的问题,您有两种方法:
[方法1]从您拥有的设备中获取libOpenCL.so或libGLES_mali.so或libPVROCL.so.上面的lib名称对应于Adreno,Mali和PowerVR GPU.使用这些库来编译代码.
[方法2]在您的本机代码中,使用dlopen打开OpenCL库,然后使用dlsym将clBlaBla API映射到您自己的名称.例如,您可以将clGetDeviceInfo映射到myCLGetDeviceInfo.然后,在您自己的本机代码中,您可以调用myClGetDeviceInfo.这种方式要求您知道设备上opencl库的路径.例如,在Adreno GPU上,位置为/system/vendor/lib/libOpenCL.so.有关详细信息,请阅读其他帖子. Does Android support OpenCL?
方法2更通用,更优雅.方法1更简单,如果您清楚地知道应用程序将运行哪些设备,则更快.例如,如果您清楚地知道您的应用程序仅用于测试adreno gpus,那么您只需从测试设备中获取libOpenCL.so即可.然后用它来链接你的应用.此链接显示了如何执行此操作,并提供了示例代码.你可以从那里开始.
在使用Android studio方面.我只能评论这个:如果您了解在Android上编译OpenCL应用程序的要求.使用Android studio进行编译或直接使用ndk-build进行编译没有区别.语法可以从一个映射到另一个.
根据我的个人经验,我写了很多Android.mk文件,我已经习惯了.所以,即使现在我使用Android Studio进行开发.您链接的文章中的方法实际上是正确的.
但是,我仍然像往常一样使用ndk-build来编译我的本机代码.这样,我可以完全控制那里发生的事情,我感觉更舒服.一旦我得到.so本机库,我把它放到src / main下的jniLibs文件夹中(你的文件夹结构可能不同). jniLibs是Android工作室将找到本机库的默认文件夹.您还可以在gradle脚本中指定自己的文件夹(在线大量文章,搜索gradle ndk).当然,所有上述操作都是通过脚本完成的(ndk-build,将库复制到某个文件夹).有了这些,我使用Android studio构建应用程序.通常,您不会同时调试JAVA代码并更改本机代码,因此执行上述操作完全可以并且非常舒适.如果要自动执行所有这些操作,可以请求gradle在构建应用程序之前启动您编写的ndk构建脚本.或者你可以让gradle以你喜欢的方式运行ndk-build命令(这实际上是由很多开发人员使用的).
希望这是有帮助的.欢迎任何进一步的讨论.
标签:android,android-gradle,android-studio,build-gradle,opencl
来源: https://codeday.me/bug/20190824/1709090.html