Библиотека Android: java.lang.UnsatisfiedLinkError: ошибка dlopen: библиотека "libgnustl_shared.so" не найдена - PullRequest
0 голосов
/ 01 ноября 2018

У меня был вопрос о сборке, особенно с использованием среды сборки Maven. Я создаю библиотеку Android, используя Android NDK (r10e). Я строю для Android 6.0 (API 23). Хотя после того, как я использую эту библиотеку в своем основном проекте и помещаю ее на свой планшет, я получаю следующую ошибку:

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

My Application.mk:

APP_ABI: = все

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

что было не очень полезно. Важно отметить, что это работает над моей реализацией Android 4.0 (API 18). Просто не на 6.0. Глядя на apk, я вижу .so в

lib\armeabi-v7a\testNativeLib.so

Есть мысли? Я застрял здесь.

1 Ответ

0 голосов
/ 01 ноября 2018

Вместе с вашей библиотекой APK должен включать время выполнения STL, в вашем случае libgnustl_shared.so. если он у вас есть только для armeabi , это может быть объяснением вашей аварии.

Другое отличие состоит в том, что в API 18 необходимо загружать библиотеку STL отдельно от Java, тогда она плохо обрабатывала зависимости.

Кстати, ваша библиотека действительно называется testNativeLib.so? Без префикса lib он не будет правильно установлен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...