У меня был вопрос о сборке, особенно с использованием среды сборки 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
Есть мысли? Я застрял здесь.