Android Room + Kotlin + Kapt + IntelliJ + MacOS Catalina: java.lang.UnsatisfiedLinkError: org.sqlite.core.NativeDB._open_utf8 安卓房间+Kotlin+Kapt+IntelliJ+MacOS Catalina: java.lang.UnsatisfiedLinkError: org.sqlite.core.NativeDB._open_utf8

3
在MacOS Catalina上使用Kapt和Android Room构建项目时,如果我从build.gradle中移除kapt "androidx.room:room-compiler:$room_version",则可以成功构建项目。但是,在保留该依赖后,出现以下错误:
Failed to load native library:sqlite-3.25.2-60e239c7-424b-4b75-bfd5-b2df4aa8e01a-libsqlitejdbc.jnilib. osinfo: Mac/x86_64
java.lang.UnsatisfiedLinkError: $TMPDIR/sqlite-3.25.2-60e239c7-424b-4b75-bfd5-b2df4aa8e01a-libsqlitejdbc.jnilib: dlopen($TMPDIR/sqlite-3.25.2-60e239c7-424b-4b75-bfd5-b2df4aa8e01a-libsqlitejdbc.jnilib, 1): no suitable image found.  Did find:
    $TMPDIR/sqlite-3.25.2-60e239c7-424b-4b75-bfd5-b2df4aa8e01a-libsqlitejdbc.jnilib: code signature in ($TMPDIR/sqlite-3.25.2-60e239c7-424b-4b75-bfd5-b2df4aa8e01a-libsqlitejdbc.jnilib) not valid for use in process using Library Validation: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed.
Failed to load native library:sqlite-3.25.2-79b61bc4-bdd0-4451-a523-5baa49728398-libsqlitejdbc.jnilib. osinfo: Mac/x86_64
java.lang.UnsatisfiedLinkError: $TMPDIR/sqlite-3.25.2-79b61bc4-bdd0-4451-a523-5baa49728398-libsqlitejdbc.jnilib: dlopen($TMPDIR/sqlite-3.25.2-79b61bc4-bdd0-4451-a523-5baa49728398-libsqlitejdbc.jnilib, 1): no suitable image found.  Did find:
    $TMPDIR/sqlite-3.25.2-79b61bc4-bdd0-4451-a523-5baa49728398-libsqlitejdbc.jnilib: code signature in ($TMPDIR/sqlite-3.25.2-79b61bc4-bdd0-4451-a523-5baa49728398-libsqlitejdbc.jnilib) not valid for use in process using Library Validation: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed.

这将产生以下异常

Caused by: java.lang.UnsatisfiedLinkError: org.sqlite.core.NativeDB._open_utf8([BI)V
    at org.sqlite.core.NativeDB._open_utf8(Native Method)
    at org.sqlite.core.NativeDB._open(NativeDB.java:78)
    at org.sqlite.core.DB.open(DB.java:195)
    at org.sqlite.SQLiteConnection.open(SQLiteConnection.java:243)
    at org.sqlite.SQLiteConnection.<init>(SQLiteConnection.java:61)
    at org.sqlite.jdbc3.JDBC3Connection.<init>(JDBC3Connection.java:28)
    at org.sqlite.jdbc4.JDBC4Connection.<init>(JDBC4Connection.java:21)
    at org.sqlite.JDBC.createConnection(JDBC.java:116)
    at androidx.room.verifier.DatabaseVerifier$Companion.create(DatabaseVerifier.kt:104)
    at androidx.room.processor.DatabaseProcessor.doProcess(DatabaseProcessor.kt:82)
    at androidx.room.processor.DatabaseProcessor.process(DatabaseProcessor.kt:57)
    at androidx.room.RoomProcessor$DatabaseProcessingStep.process(RoomProcessor.kt:134)
    at com.google.auto.common.BasicAnnotationProcessor.process(BasicAnnotationProcessor.java:330)
    at com.google.auto.common.BasicAnnotationProcessor.process(BasicAnnotationProcessor.java:181)
    at org.jetbrains.kotlin.kapt3.base.incremental.IncrementalProcessor.process(incrementalProcessors.kt)
    at org.jetbrains.kotlin.kapt3.base.ProcessorWrapper.process(annotationProcessing.kt:147)
    at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:985)
    ... 39 more

看起来这与https://github.com/xerial/sqlite-jdbc/issues/97不同,这是我找到的唯一有关信息的问题。有没有办法解决这个问题?

编辑:

最终我找到了这篇博客文章,这让我找到了这个JDK问题。我验证了./gradlew:app:kaptDebugKotlin可以使用我的JDK11,并更新了IDEA使用该JDK作为运行时,并告诉它使用gradle而不是IDEA执行构建。这些都似乎没有解决问题 - 在我的终端中使用JDK11运行./gradlew clean:app:kaptDebugKotlin成功,但通过IDEA运行该gradle任务失败。

最终,我通过从运行配置中删除gradle-aware make并在每次更改应用程序时运行./gradlew:app:assembleDebug来解决了这个问题。这有点烦人并增加了一个额外的步骤,但我仍然可以运行/更新应用程序。


请参见 https://youtrack.jetbrains.com/issue/KT-40474。 - CrazyCoder
类似的问题,但在 Expo / React Native 环境中,可以在以下链接找到解决方案:https://dev59.com/ssTra4cB1Zd3GeqP0DEF - Daniel Danielecki
1个回答

1

我明白了——原来在Android项目中Java SDKGradle设置会被忽略,而是使用Android SDK中的Java SDK来运行gradle任务。将Android SDKJava SDK设置���JDK11解决了问题,因为该JDK包含JDK-8223671的修复程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接