Java Android Studio中的OpenCL
我想在Android Studio中使用OpenCL 我从我的安卓设备上抓取了libOpenCL.so,然后把它放进去 jniLibs/[ABI]/ 我将头文件放到jni/CL/ 编辑: 我切换到gradle实验:0.6.0-alpha7,它带来了一些其他问题,我用以下内容替换了第一部分:Java Android Studio中的OpenCL,java,android,android-ndk,android-gradle-plugin,opencl,Java,Android,Android Ndk,Android Gradle Plugin,Opencl,我想在Android Studio中使用OpenCL 我从我的安卓设备上抓取了libOpenCL.so,然后把它放进去 jniLibs/[ABI]/ 我将头文件放到jni/CL/ 编辑: 我切换到gradle实验:0.6.0-alpha7,它带来了一些其他问题,我用以下内容替换了第一部分: repositories { libs(PrebuiltLibraries) { OpenCL { headers.srcDir "src/main/jni/C
repositories {
libs(PrebuiltLibraries) {
OpenCL {
headers.srcDir "src/main/jni/CL"
binaries.withType(SharedLibraryBinary) {
sharedLibraryFile = file("src/main/jniLibs/${targetPlatform.getName()}/libOpenCL.so")
}
}
}
}
android.sources {
main {
jni {
dependencies {
library "OpenCL" linkage "shared"
}
}
}
}
现在它给出了以下错误:
C:\Users\Umut\Desktop\HelloJNI\app\src\main\jniLibs\arm64-v8a\libOpenCL.so:添加符号时出错:文件格式错误
错误:错误:ld返回了1个退出状态
错误:任务执行失败:app:linkHello-jniArm64-v8aDebugAllSharedLibrary。
生成操作失败。
链接libhello-jni.so时链接器失败
“格式错误的文件”到底是什么意思?我直接从我的安卓手机上取了图书馆
有谁能帮我解决我做错了什么或者我应该怎么做来解决这个问题
由于我是android开发和gradle的新手,如果我误解了什么,请向我道歉
以前使用GRADLE实验0.4.0的尝试
使用gradle Experiative:0.4.0时,我将其放入build.gradle文件:
android.sources {
main {
jniLibs {
dependencies {
library file("src/main/jniLibs/armeabi-v7a/libOpenCL.so") abi "armeabi-v7a"
library file("src/main/jniLibs/armeabi/libOpenCL.so") abi "armeabi"
library file("src/main/jniLibs/x86/libOpenCL.so") abi "x86"
}
}
}
}
这是build.gradle中我的ndk块:
android.ndk {
moduleName = "openCLJni"
cppFlags.addAll(["-I${file("src/main/jniLibs/")}".toString()])
ldLibs.addAll(["android", "log"])
stl = "stlport_static"
}
我尝试从我的openCLJni.c中进行一个非常简单的函数调用:
jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
jobject thiz )
{
cl_uint ret_num_platforms;
cl_platform_id platform_id = NULL;
cl_int ret = clGetPlatformIDs(1, &platform_id, &ret_num_platforms);
return (*env)->NewStringUTF(env, "Hello from JNI");
}
但它给了我一个错误:
错误:(65)对“clGetPlatformIDs”的引用未定义
及
错误:任务执行失败:app:linkArm64-v8aDebugAllHello-jniSharedLibrary'
生成操作失败。
链接libhello-jni.so时链接器失败。
请参阅完整日志,网址为:file:///C:/Users/Umut/Desktop/OpenCLTest2/app/build/tmp/linkArm64-v8aDebugAllHello jniSharedLibrary/output.txt
有同样的问题,我设法解决了: 该库是为特定的体系结构而构建的,如果您没有在gradle构建中添加abiFilter,那么它将尝试为所有可用的体系结构编译并使用该库,因为对于大多数体系结构,该库是不兼容的,因此您会得到错误格式的文件 解决方案是简单地为从中获取库的体系结构添加一个abiFilter。我从Galaxy Note 5中得到了图书馆。我在gradlebuild中为“armeabi”添加了一个abiFilter,它起了作用。同样的文件也适用于“armeabi-v7a”体系结构 我还注意到,有几个版本的库,你可以用ADB拉。我从“/system/vendor/lib64/egl”中找到并提取了libGLES_mali.so,它也是OpenCL mali库,能够使用运行更快的“arm64-v8a”体系结构运行OpenCL 您只需在正确的architecture library文件夹中为您想要支持的体系结构拉入并添加正确的库,并在gradle中创建与库的体系结构匹配的风格 以下是我使用gradle实验版0.7.0的gradle构建文件:
apply plugin: 'com.android.model.application'
model {
repositories {
libs(PrebuiltLibraries) {
OpenCL {
headers.srcDir "src/main/jniLibs/include/CL"
binaries.withType(SharedLibraryBinary) {
sharedLibraryFile = file("src/main/jniLibs/${targetPlatform.getName()}/libGLES_mali.so")
}
}
}
}
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "com.apps.opencl_app"
minSdkVersion.apiLevel 15
targetSdkVersion.apiLevel 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles.add(file('proguard-android.txt'))
}
}
ndk {
moduleName = "sr_native"
CFlags.add("-I${file("src/main/jniLibs/include/CL")}".toString())
cppFlags.add("-I${file("src/main/jniLibs/include/CL")}".toString())
ldLibs.addAll(["log"])
abiFilters.add("arm64-v8a")
}
sources {
main {
jni {
dependencies {
library "OpenCL" linkage "shared"
}
}
}
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.4.0'
}
有同样的问题,我设法解决了: 该库是为特定的体系结构而构建的,如果您没有在gradle构建中添加abiFilter,那么它将尝试为所有可用的体系结构编译并使用该库,因为对于大多数体系结构,该库是不兼容的,因此您会得到错误格式的文件 解决方案是简单地为从中获取库的体系结构添加一个abiFilter。我从Galaxy Note 5中得到了图书馆。我在gradlebuild中为“armeabi”添加了一个abiFilter,它起了作用。同样的文件也适用于“armeabi-v7a”体系结构 我还注意到,有几个版本的库,你可以用ADB拉。我从“/system/vendor/lib64/egl”中找到并提取了libGLES_mali.so,它也是OpenCL mali库,能够使用运行更快的“arm64-v8a”体系结构运行OpenCL 您只需在正确的architecture library文件夹中为您想要支持的体系结构拉入并添加正确的库,并在gradle中创建与库的体系结构匹配的风格 以下是我使用gradle实验版0.7.0的gradle构建文件:
apply plugin: 'com.android.model.application'
model {
repositories {
libs(PrebuiltLibraries) {
OpenCL {
headers.srcDir "src/main/jniLibs/include/CL"
binaries.withType(SharedLibraryBinary) {
sharedLibraryFile = file("src/main/jniLibs/${targetPlatform.getName()}/libGLES_mali.so")
}
}
}
}
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "com.apps.opencl_app"
minSdkVersion.apiLevel 15
targetSdkVersion.apiLevel 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles.add(file('proguard-android.txt'))
}
}
ndk {
moduleName = "sr_native"
CFlags.add("-I${file("src/main/jniLibs/include/CL")}".toString())
cppFlags.add("-I${file("src/main/jniLibs/include/CL")}".toString())
ldLibs.addAll(["log"])
abiFilters.add("arm64-v8a")
}
sources {
main {
jni {
dependencies {
library "OpenCL" linkage "shared"
}
}
}
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.4.0'
}
对于现代系统,您应该使用
adb pull /system/vendor/lib64/libOpenCL.so
目前,大多数教程都会告诉您使用
adb pull /system/vendor/lib/libOpenCL.so
它可以工作,但我想这个库是32位系统的。对于现代系统,你应该使用它
adb pull /system/vendor/lib64/libOpenCL.so
目前,大多数教程都会告诉您使用
adb pull /system/vendor/lib/libOpenCL.so
它可以工作,但我想这个库是为32位系统设计的。似乎错误为您指明了正确的方向。必须添加共享库以链接clGetPlatformIDs()函数。我使用NDK_BUILD(不是gradle)来实现这一点,它的工作原理如下:我想你应该在这里添加库:
ldLibs.addAll([“android”,“log”])
其中android
指的是libandroid。所以和log
指的是liblog。所以你的包括东西。您已经为标题设置了include路径,但是没有告诉链接器任何关于clGetPlatformIDs
的信息,谢谢您的回答,但是当我尝试像这样添加opencl时:ldLibs.addAll([“安卓”、“日志”、“opencl”]))
它给了我这个错误:C:/Users/MYNAME/AppData/Local/Android/sdk/ndk bundle/toolschains/aarch64-linux-Android-4.9/prebuild/windows-x86_64/bin/。/lib/gcc/aarch64-linux-Android/4.9/../../../../../../aarch64-linux-Android/bin/ld.exe:找不到-lOpenCL
似乎错误指向了正确的方向。必须添加共享库以链接clGetPlatformIDs()函数。我使用NDK_BUILD(不是gradle)来实现这一点,它的工作原理如下:我想你应该在这里添加库:ldLibs.addAll([“android”,“log”])
其中android
指的是libandroid。所以和log
指的是liblog。所以你的包括东西。你