Android 如何包含libc++_那么,是不是可以通过gradle以编程方式将shared.so导入我的APK?
在项目中更新:Android 如何包含libc++_那么,是不是可以通过gradle以编程方式将shared.so导入我的APK?,android,gradle,android-ndk,gstreamer,Android,Gradle,Android Ndk,Gstreamer,在项目中更新: Gstreamer 1.14.5->Gstreamer 1.18.0 NDKr16->NDKr21.3.6528147 构建:渐变:3.5.3->构建:渐变:4.1.0 BuildToolsVersion29.0.3 compileSdk: 29, minSdk : 26, targetSdk : 29, material : "1.2.1", constraint: "2.0.2", ktx : &
- Gstreamer 1.14.5->Gstreamer 1.18.0
- NDKr16->NDKr21.3.6528147
- 构建:渐变:3.5.3->构建:渐变:4.1.0
- BuildToolsVersion29.0.3
compileSdk: 29, minSdk : 26, targetSdk : 29, material : "1.2.1", constraint: "2.0.2", ktx : "1.1.0", espresso : "3.1.0", mockito : "2.9.0", junit : "4.13.1"
java.lang.UnsatisfiedLinkError: dlopen failed: library "libc++_shared.so" not found
at java.lang.Runtime.loadLibrary0(Runtime.java:1071)
at java.lang.Runtime.loadLibrary0(Runtime.java:1007)
at java.lang.System.loadLibrary(System.java:1667)
at com.kbnt.naparnik.client.MainActivity.<clinit>(MainActivity.java:103)
at java.lang.Class.newInstance(Native Method)
...
Application.mk文件:
APP_STL := c++_shared
APP_PLATFORM := android-26
我在文件中发现了一个注意事项:
libc++不是一个系统库。如果使用libc++_shared.so,则必须将其包含在APK中。如果您使用Gradle构建应用程序,这将自动处理
我理解它构建不正确,因为我的APK不包括库
如何使用gradle以编程方式将libc++\u shared.so包含到我的APK中?
项目结构
app/build.gradle:
android {
compileSdkVersion versions.compileSdk
defaultConfig {
...
externalNativeBuild {
ndkBuild {
if (System.getenv("GSTREAMER_ROOT_ANDROID") == null)
throw new GradleException("Define GSTREAMER_ROOT_ANDROID environment variable")
targets "client"
abiFilters "armeabi-v7a", 'arm64-v8a'
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild {
ndkBuild {
path 'src/main/jni/Android.mk'
}
}
ndkVersion '21.3.6528147'
buildToolsVersion '29.0.3'
...
它看起来像是针对“客户机”的问题。尝试完全删除它或指定
NDK\u应用程序\u MK
:
...
externalNativeBuild {
ndkBuild {
...
targets "client"
arguments "NDK_APPLICATION_MK:=Application.mk"
...
}
}
}
...
我重构了我的Android.mk
GSTREAMER\u插件
字段,并添加了GSTREAMER\u额外的库
。我用在我的项目中使用的特定插件替换了类别,它解决了我的问题
...
GSTREAMER_PLUGINS := coreelements udp rtpmanager rtp opengl playback
GSTREAMER_EXTRA_LIBS := -liconv
...
看起来类别中的一些插件有一个bug
感谢@NikolayKhilyuk试图帮助我在
app/build.gradle
中如何查看externalNativeBuild.ndkBuild
部分?@NikolayKhilyuk将app/build.gradle添加到问题中,当然,如果路径正确(src/main/jni/Android.mk
),一切看起来都很好,因为它不同于项目结构的快照。@NikolayKhilyuk路径是正确的。更新了项目结构截图1)如果我删除目标“客户机”
则接受此问题:任务执行失败:app:externalNativeBuildDebug'>预期输出文件位于gst-build-arm64-v8a/libgstreamer\u android。因此,对于target-gstreamer\u android,这里没有一个解决方案,该解决方案表示放置目标字段2)如果设置参数“NDK\u APPLICATION\u MK:=APPLICATION.MK”
则会产生另一个问题:任务执行失败:app:generateJsonModelDebug'>为ndkBuild/home/dev18/Development/naparnik client/app/src/main/jni/Android.MK执行外部本机构建可能存在路径问题,请尝试arguments“NDK\u APPLICATION\u MK:=src/main/jni/APPLICATION.MK”
...
GSTREAMER_PLUGINS := coreelements udp rtpmanager rtp opengl playback
GSTREAMER_EXTRA_LIBS := -liconv
...