Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android Studio中的OpenCL_Java_Android_Android Ndk_Android Gradle Plugin_Opencl - Fatal编程技术网

Java Android Studio中的OpenCL

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

我想在Android Studio中使用OpenCL

我从我的安卓设备上抓取了libOpenCL.so,然后把它放进去 jniLibs/[ABI]/

我将头文件放到jni/CL/

编辑:

我切换到gradle实验:0.6.0-alpha7,它带来了一些其他问题,我用以下内容替换了第一部分:

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。所以你的
包括
东西。你