Android库:java.lang.UnsatisfiedLinkError: dlopen失败:找不到库"libgnustl_shared.so"

3

我有一个构建问题,具体涉及使用Maven构建环境。我正在使用Android NDK(r10e)构建Android库,构建版本为Android 6.0(API 23)。然而,在将此库用于我的主项目并将其拖放到平板电脑上后,我遇到了以下错误:

java.lang.UnsatisfiedLinkError: dlopen failed: library "libgnustl_shared.so" not found

我的 Application.mk 文件如下:

APP_ABI := all

APP_STL:=gnustl_shared

APP_CPPFLAGS += -std=c++11

我的 Maven 文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>myParent</artifactId>
        <groupId>com.test.android</groupId>
        <version>1.05</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>myNativeLib</artifactId>

    <packaging>so</packaging>

    <name>testNativeLib</name>

    <properties>
        <android.ndk.args>V=1 -B NDK_DEBUG=1 -j8</android.ndk.args>
        <arch>armeabi-v7a armeabi</arch> <!-- TODO add more arch types -->
        <mavenAntrunPluginVersion>1.8</mavenAntrunPluginVersion>
        <includes.version>1.0.6</includes.version>
        <sonar.sources>src,pom.xml</sonar.sources>
    </properties>

    <build>

        <extensions>
            <extension>
                <groupId>org.apache.maven.wagon</groupId>
                <artifactId>wagon-webdav</artifactId>
                <version>1.0-beta-2</version>
            </extension>
        </extensions>

        <plugins>
            <plugin>
                <groupId>com.simpligility.maven.plugins</groupId>
                <artifactId>android-ndk-maven-plugin</artifactId>
                <version>1.0.1-SNAPSHOT</version>
                <extensions>true</extensions>
                <configuration>
                    <target>${project.artifactId}</target>
                    <finalLibraryName>${project.artifactId}</finalLibraryName>
                    <ndkPath>${android.ndk.path}</ndkPath>
                    <!-- so jenkins parameter -Dandroid.ndk.path actually works. -->
                    <applicationMakefile>src/main/cpp/Application.mk</applicationMakefile>
                    <makefile>src/main/cpp/Android.mk</makefile>
                    <architectures>${arch}</architectures>
                    <additionalCommandline>${android.ndk.args}</additionalCommandline>
                    <librariesOutputDirectory>${project.build.directory}/ndk-libs</librariesOutputDirectory>
                    <objectsOutputDirectory>${project.build.directory}/ndk-obj</objectsOutputDirectory>
                    <headerFilesDirectives>
                        <headerFilesDirective>
                            <directory>${basedir}/src/main/cpp</directory>
                            <includes>
                                <include>**\/*.hpp</include>
                            </includes>
                        </headerFilesDirective>
                    </headerFilesDirectives>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <!-- placeholder -->
    <profiles>
        <profile>
            <id>release</id>
            <activation>
                <property>
                    <name>performRelease</name>
                </property>
            </activation>
            <properties>
                <android.ndk.args>V=1 -B -j8</android.ndk.args>
            </properties>
        </profile>
    </profiles>
</project>

现在,这将生成我想要的.so 文件并将其放置在我的.m2(仓库)文件夹中。然后,我进入我的主项目,它可以顺利构建。但是当我将其拖放到平板电脑并启动它(尝试加载库时),就会失败。在此设置中,我没有看到任何关于此问题的SO讨论。最接近的是这个已经关闭的线程:Android Studio: java.lang.UnsatisfiedLinkError: dlopen failed。这对我来说并不是很有帮助。需要注意的是,这可以在我的Android 4.0实现(API 18)上工作,但在6.0上不行。查看apk时,我可以看到.so 文件。
lib\armeabi-v7a\testNativeLib.so

有什么想法吗?我被卡住了。

或者,如果我们有一种方法将libgnustl_shared.so文件添加到libs文件夹中。是否有一种直接从NDK复制它的方法?即lib\armeabi-v7a\。 - New Guy
NDK 可能已将此库复制到 ${project.build.directory}/ndk-libs - Alex Cohn
2个回答

0

除了您的库外,APK 必须包括 STL 运行时,在您的情况下是 libgnustl_shared.so。如果此库仅适用于 armeabi,这可能是崩溃的原因之一。

另一个区别在于,在 API 18 中,您必须从 Java 单独加载 STL 库,因为它无法很好地处理依赖关系。

顺便问一下,您的库真的命名为 testNativeLib.so 吗?如果没有 lib 前缀,它将不能被正确安装。


请说明需要什么?首先,让我们检查您的APK内容:它是否有STL库?(您可以使用任何zip查看器进行检查) - Alex Cohn
我的APK的libs文件夹中没有libgnustl_shared.so库。除非我漏掉了其他需要检查的区域? - New Guy
STL运行时不是系统的一部分。它作为三星臭名昭著的垃圾软件之一在Note 4上被安装,导致了许多问题。最佳实践是使用你的NDK版本打包到APK中。ndk-build会处理这个问题,所以你只需要调整你的Maven来将这个文件与libtestNativeLib.so一起打包。 - Alex Cohn
如果你把它放到.m2存储库中一次,它就会一直在那里。 - Alex Cohn
让我们在聊天中继续这个讨论 - Alex Cohn
显示剩余7条评论

0

将 libs 文件复制到

src/main/libs

在 app.gradle 文件中指定 libs 文件路径

enter image description here


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