Android studio tesseract dlopen在android studio中失败

Android studio tesseract dlopen在android studio中失败,android-studio,gradle,android-ndk,tesseract,dlopen,Android Studio,Gradle,Android Ndk,Tesseract,Dlopen,我已经下载了最新的tesseract(tess two),我遵循了大部分在互联网上编写的关于如何将libs与project集成的方法,但是我注意到最新的tess two版本在build.gradle中有ndk bulid相关文件,所以我将构建libarires留给了android studio,这就是所谓的成功。这是tess 2的build.gradle: import org.apache.tools.ant.taskdefs.condition.Os apply plugin: 'co

我已经下载了最新的tesseract(tess two),我遵循了大部分在互联网上编写的关于如何将libs与project集成的方法,但是我注意到最新的tess two版本在build.gradle中有ndk bulid相关文件,所以我将构建libarires留给了android studio,这就是所谓的成功。这是tess 2的build.gradle:

  import org.apache.tools.ant.taskdefs.condition.Os

apply plugin: 'com.android.library'


android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            res.srcDirs = ['res']
            jni.srcDirs = []
            jniLibs.srcDirs = ['libs']

        }
    }

    // Call external ndk-build(.cmd) script to build the native code
    task ndkBuild(type: Exec) {
        def ndkBuildExt = Os.isFamily(Os.FAMILY_WINDOWS) ? ".cmd" : ""
        commandLine "${android.ndkDirectory}/ndk-build${ndkBuildExt}",
                '-C', file('.').absolutePath,
                '-j', Runtime.runtime.availableProcessors()
    }

    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn ndkBuild
    }

    // Cleanup task to remove previously generated binaries
    task ndkClean(type: Exec) {
        def ndkBuildExt = Os.isFamily(Os.FAMILY_WINDOWS) ? ".cmd" : ""
        commandLine "${android.ndkDirectory}/ndk-build${ndkBuildExt}",
                '-C', file('.').absolutePath, 'clean'
    }

    tasks.withType(Delete) {
        cleanTask -> cleanTask.dependsOn ndkClean
    } 
}

dependencies {
    compile 'com.github.dcendents:android-maven-plugin:1.2'
    compile fileTree(dir: 'libs', include: ['*.jar'])
}


// Settings for uploading module AAR to Bintray for library distribution

task sourcesJar(type: Jar) {
    from android.sourceSets.main.java.srcDirs
    classifier = 'sources'
}

task javadoc(type: Javadoc) {
    source = android.sourceSets.main.java.srcDirs
    classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
    options {
        links "http://docs.oracle.com/javase/7/docs/api/"
        linksOffline "http://d.android.com/reference","${android.sdkDirectory}/docs/reference"
    }
}


task javadocJar(type: Jar, dependsOn: javadoc) {
    classifier = 'javadoc'
    from javadoc.destinationDir
}

artifacts {
    archives javadocJar
    archives sourcesJar
}



Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
下面是构建日志:

Information:Gradle tasks [:app:assembleDebug]
:app:preBuild UP-TO-DATE
:app:preDebugBuild UP-TO-DATE
:app:checkDebugManifest
:app:preReleaseBuild UP-TO-DATE
:libraries:tess-two:preBuild UP-TO-DATE
:libraries:tess-two:preReleaseBuild UP-TO-DATE
:libraries:tess-two:compileReleaseNdk UP-TO-DATE
:libraries:tess-two:compileLint
:libraries:tess-two:copyReleaseLint UP-TO-DATE
:libraries:tess-two:mergeReleaseProguardFiles UP-TO-DATE
:libraries:tess-two:packageReleaseRenderscript UP-TO-DATE
:libraries:tess-two:checkReleaseManifest
:libraries:tess-two:prepareReleaseDependencies
:libraries:tess-two:compileReleaseRenderscript UP-TO-DATE
:libraries:tess-two:generateReleaseResValues UP-TO-DATE
:libraries:tess-two:generateReleaseResources UP-TO-DATE
:libraries:tess-two:packageReleaseResources UP-TO-DATE
:libraries:tess-two:compileReleaseAidl UP-TO-DATE
:libraries:tess-two:generateReleaseBuildConfig UP-TO-DATE
:libraries:tess-two:generateReleaseAssets UP-TO-DATE
:libraries:tess-two:mergeReleaseAssets UP-TO-DATE
:libraries:tess-two:processReleaseManifest UP-TO-DATE
:libraries:tess-two:processReleaseResources UP-TO-DATE
:libraries:tess-two:generateReleaseSources UP-TO-DATE
:libraries:tess-two:ndkBuild
make: Entering directory `/Users/sieciech/AndroidStudioProjects/OCRTestDwa/libraries/tess-two'
[armeabi] Install        : libjpeg.so => libs/armeabi/libjpeg.so
[armeabi] Install        : liblept.so => libs/armeabi/liblept.so
[armeabi] Install        : libpng.so => libs/armeabi/libpng.so
[armeabi] Install        : libtess.so => libs/armeabi/libtess.so
[armeabi-v7a] Install        : libjpeg.so => libs/armeabi-v7a/libjpeg.so
[armeabi-v7a] Install        : liblept.so => libs/armeabi-v7a/liblept.so
[armeabi-v7a] Install        : libpng.so => libs/armeabi-v7a/libpng.so
[armeabi-v7a] Install        : libtess.so => libs/armeabi-v7a/libtess.so
[x86] Install        : libjpeg.so => libs/x86/libjpeg.so
[x86] Install        : liblept.so => libs/x86/liblept.so
[x86] Install        : libpng.so => libs/x86/libpng.so
[x86] Install        : libtess.so => libs/x86/libtess.so
[mips] Install        : libjpeg.so => libs/mips/libjpeg.so
[mips] Install        : liblept.so => libs/mips/liblept.so
[mips] Install        : libpng.so => libs/mips/libpng.so
[mips] Install        : libtess.so => libs/mips/libtess.so
[arm64-v8a] Install        : libjpeg.so => libs/arm64-v8a/libjpeg.so
[arm64-v8a] Install        : liblept.so => libs/arm64-v8a/liblept.so
[arm64-v8a] Install        : libpng.so => libs/arm64-v8a/libpng.so
[arm64-v8a] Install        : libtess.so => libs/arm64-v8a/libtess.so
[x86_64] Install        : libjpeg.so => libs/x86_64/libjpeg.so
[x86_64] Install        : liblept.so => libs/x86_64/liblept.so
[x86_64] Install        : libpng.so => libs/x86_64/libpng.so
[x86_64] Install        : libtess.so => libs/x86_64/libtess.so
[mips64] Install        : libjpeg.so => libs/mips64/libjpeg.so
[mips64] Install        : liblept.so => libs/mips64/liblept.so
[mips64] Install        : libpng.so => libs/mips64/libpng.so
[mips64] Install        : libtess.so => libs/mips64/libtess.so
make: Leaving directory `/Users/sieciech/AndroidStudioProjects/OCRTestDwa/libraries/tess-two'
:libraries:tess-two:compileReleaseJavaWithJavac UP-TO-DATE
:libraries:tess-two:processReleaseJavaRes UP-TO-DATE
:libraries:tess-two:transformResourcesWithMergeJavaResForRelease UP-TO-DATE
:libraries:tess-two:transformClassesAndResourcesWithSyncLibJarsForRelease UP-TO-DATE
:libraries:tess-two:mergeReleaseJniLibFolders UP-TO-DATE
:libraries:tess-two:transformNative_libsWithMergeJniLibsForRelease UP-TO-DATE
:libraries:tess-two:transformNative_libsWithSyncJniLibsForRelease UP-TO-DATE
:libraries:tess-two:bundleRelease UP-TO-DATE
:app:prepareComAndroidSupportAppcompatV72311Library UP-TO-DATE
:app:prepareComAndroidSupportDesign2311Library UP-TO-DATE
:app:prepareComAndroidSupportRecyclerviewV72311Library UP-TO-DATE
:app:prepareComAndroidSupportSupportV42311Library UP-TO-DATE
:app:prepareOCRTestDwaLibrariesTessTwoUnspecifiedLibrary UP-TO-DATE
:app:prepareDebugDependencies
:app:compileDebugAidl UP-TO-DATE
:app:compileDebugRenderscript UP-TO-DATE
:app:generateDebugBuildConfig UP-TO-DATE
:app:generateDebugAssets UP-TO-DATE
:app:mergeDebugAssets UP-TO-DATE
:app:generateDebugResValues UP-TO-DATE
:app:generateDebugResources UP-TO-DATE
:app:mergeDebugResources UP-TO-DATE
:app:processDebugManifest UP-TO-DATE
:app:processDebugResources UP-TO-DATE
:app:generateDebugSources UP-TO-DATE
:app:compileDebugJavaWithJavac UP-TO-DATE
:app:compileDebugNdk UP-TO-DATE
:app:compileDebugSources UP-TO-DATE
:app:transformClassesWithDexForDebug UP-TO-DATE
:app:mergeDebugJniLibFolders UP-TO-DATE
:app:transformNative_libsWithMergeJniLibsForDebug UP-TO-DATE
:app:processDebugJavaRes UP-TO-DATE
:app:transformResourcesWithMergeJavaResForDebug UP-TO-DATE
:app:validateDebugSigning
:app:packageDebug UP-TO-DATE
:app:zipalignDebug UP-TO-DATE
:app:assembleDebug UP-TO-DATE
Information:BUILD SUCCESSFUL
Information:Total time: 4.991 secs
Information:0 errors
Information:0 warnings
Information:See complete output in console
不幸的是,在我的sony xperia上运行后应用程序时,我遇到了以下异常:

22:05:04.097 17868-17868/com.example.sieciech.ocrtestdwa E/dalvikvm: dlopen("/data/app-lib/com.example.sieciech.ocrtestdwa-2/liblept.so") failed: dlopen failed: cannot locate symbol "png_set_longjmp_fn" referenced by "liblept.so"...
02-09 22:05:04.097 17868-17868/com.example.sieciech.ocrtestdwa W/dalvikvm: Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lcom/googlecode/tesseract/android/TessBaseAPI;
02-09 22:05:04.097 17868-17868/com.example.sieciech.ocrtestdwa D/AndroidRuntime: Shutting down VM
02-09 22:05:04.097 17868-17868/com.example.sieciech.ocrtestdwa W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x4164fd88)
02-09 22:05:04.107 17868-17868/com.example.sieciech.ocrtestdwa E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                 Process: com.example.sieciech.ocrtestdwa, PID: 17868
                                                                                 java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "png_set_longjmp_fn" referenced by "liblept.so"...
                                                                                     at java.lang.Runtime.loadLibrary(Runtime.java:364)
                                                                                     at java.lang.System.loadLibrary(System.java:526)
                                                                                     at com.googlecode.tesseract.android.TessBaseAPI.<clinit>(TessBaseAPI.java:44)
                                                                                     at com.example.sieciech.ocrtestdwa.MainActivity.onCreate(MainActivity.java:59)
                                                                                     at android.app.Activity.performCreate(Activity.java:5240)
                                                                                     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1088)
                                                                                     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2216)
                                                                                     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2301)
                                                                                     at android.app.ActivityThread.access$800(ActivityThread.java:144)
                                                                                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1246)
                                                                                     at android.os.Handler.dispatchMessage(Handler.java:106)
                                                                                     at android.os.Looper.loop(Looper.java:136)
                                                                                     at android.app.ActivityThread.main(ActivityThread.java:5212)
                                                                                     at java.lang.reflect.Method.invokeNative(Native Method)
                                                                                     at java.lang.reflect.Method.invoke(Method.java:515)
                                                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
                                                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
                                                                                     at dalvik.system.NativeStart.main(Native Method)
但是
readelf

readelf -a ./x86_64/liblept.so | grep png_set_longjmp_fn
00000027add0  084900000007 R_X86_64_JUMP_SLO 0000000000000000 png_set_longjmp_fn + 0
不管我是查看libs/x86_64还是libs/armXX或libs/mips,对于nm总是没有符号,对于readelf,我得到的输出如上所述

我打开了apk文件,所有的库都在那里


你知道我该怎么做才能让事情顺利进行吗?

通过执行
git pull
并重建来更新你的OCR库。由于Android 4.4在运行时使用了其版本的libpng,而不是OCR库中可用的版本,因此发生了此错误。(显然,这只是安卓4.4上的问题,而不是安卓其他版本上的问题。)在新版OCR库中,libpng被重命名为
libpngt
,以解决此崩溃问题,并在安卓4.4上正常运行通过执行
git pull
和重建更新OCR库。由于Android 4.4在运行时使用了其版本的libpng,而不是OCR库中可用的版本,因此发生了此错误。(显然,这只是Android 4.4上的一个问题,而不是其他版本的Android上的问题。)在新版OCR库中,libpng被重命名为
libpngt
,以解决此崩溃问题,并在Android 4.4上正常运行转到cmd中的JNI文件(它将被命名为
测试二/JNI
或其他名称)然后在
cmd
中运行
your\u ndk\u path/ndk build.cmd
code

在cmd中,它看起来像:

\your_project_path\ tess-two-master\ tess-two\ jni>
your_ndk_path\ Android\ Sdk\ ndk-bundle\ ndk-build.cmd
注意:完成所有这些操作后,您必须删除此呼叫

// Call external ndk-build(.cmd) script to build the native code
task ndkBuild(type: Exec) {
    def ndkBuildExt = Os.isFamily(Os.FAMILY_WINDOWS) ? ".cmd" : ""
    commandLine "${android.ndkDirectory}/ndk-build${ndkBuildExt}",
            '-C', file('.').absolutePath,
            '-j', Runtime.runtime.availableProcessors()
}

// Cleanup task to remove previously generated binaries
task ndkClean(type: Exec) {
    def ndkBuildExt = Os.isFamily(Os.FAMILY_WINDOWS) ? ".cmd" : ""
    commandLine "${android.ndkDirectory}/ndk-build${ndkBuildExt}",
            '-C', file('.').absolutePath, 'clean'
}

tasks.withType(Delete) {
    cleanTask -> cleanTask.dependsOn ndkClean
} 

转到cmd中的JNI文件(它将被命名为
testtwo/JNI
或其他名称),并在
cmd
中运行
your\u ndk\u path/ndk build.cmd
code

在cmd中,它看起来像:

\your_project_path\ tess-two-master\ tess-two\ jni>
your_ndk_path\ Android\ Sdk\ ndk-bundle\ ndk-build.cmd
注意:完成所有这些操作后,您必须删除此呼叫

// Call external ndk-build(.cmd) script to build the native code
task ndkBuild(type: Exec) {
    def ndkBuildExt = Os.isFamily(Os.FAMILY_WINDOWS) ? ".cmd" : ""
    commandLine "${android.ndkDirectory}/ndk-build${ndkBuildExt}",
            '-C', file('.').absolutePath,
            '-j', Runtime.runtime.availableProcessors()
}

// Cleanup task to remove previously generated binaries
task ndkClean(type: Exec) {
    def ndkBuildExt = Os.isFamily(Os.FAMILY_WINDOWS) ? ".cmd" : ""
    commandLine "${android.ndkDirectory}/ndk-build${ndkBuildExt}",
            '-C', file('.').absolutePath, 'clean'
}

tasks.withType(Delete) {
    cleanTask -> cleanTask.dependsOn ndkClean
}