如何使用 gradle 以编程方式将 libc++_shared.so 包含到我的 APK 中?
How to include libc++_shared.so into my APK programmatically with gradle?
在项目中更新:
Gstreamer 1.14.5 -> Gstreamer 1.18.0
NDKr16 -> NDKr21.3.6528147
构建:gradle:3.5.3 -> build:gradle:4.1.0
buildToolsVersion 29.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)
...
项目构建正确,但是当我 运行 应用程序崩溃时出现问题
Android.mk 文件:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := client
LOCAL_SRC_FILES := client.c
LOCAL_SHARED_LIBRARIES := gstreamer_android
LOCAL_LDLIBS := -llog -landroid
include $(BUILD_SHARED_LIBRARY)
ifndef GSTREAMER_ROOT_ANDROID
$(error GSTREAMER_ROOT_ANDROID is not defined!)
endif
ifeq ($(TARGET_ARCH_ABI),armeabi)
GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/arm
else ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/armv7
else ifeq ($(TARGET_ARCH_ABI),arm64-v8a)
GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/arm64
else ifeq ($(TARGET_ARCH_ABI),x86)
GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/x86
else ifeq ($(TARGET_ARCH_ABI),x86_64)
GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/x86_64
else
#$(error Target arch ABI not supported: $(TARGET_ARCH_ABI))
GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/armv7
endif
GSTREAMER_NDK_BUILD_PATH := $(GSTREAMER_ROOT)/share/gst-android/ndk-build/
include $(GSTREAMER_NDK_BUILD_PATH)/plugins.mk
GSTREAMER_PLUGINS := $(GSTREAMER_PLUGINS_CORE) \
$(GSTREAMER_PLUGINS_CODECS) \
$(GSTREAMER_PLUGINS_EFFECTS) \
$(GSTREAMER_PLUGINS_NET) \
$(GSTREAMER_PLUGINS_CAPTURE) \
$(GSTREAMER_PLUGINS_PLAYBACK) \
$(GSTREAMER_PLUGINS_SYS)
GSTREAMER_EXTRA_DEPS := gstreamer-video-1.0
include $(GSTREAMER_NDK_BUILD_PATH)/gstreamer-1.0.mk
Application.mk 文件:
APP_STL := c++_shared
APP_PLATFORM := android-26
我在文档中找到注释 https://developer.android.com/ndk/guides/cpp-support#c_runtime_libraries:
libc++ is not a system library. If you use libc++_shared.so, it must be included in your APK. If you're building your application with Gradle this is handled automatically.
我知道它构建不正确,因为我的 APK 不包含库
如何使用 gradle 以编程方式将 libc++_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'
...
看起来像 targets "client"
问题。尝试完全删除它或指定 NDK_APPLICATION_MK
:
...
externalNativeBuild {
ndkBuild {
...
targets "client"
arguments "NDK_APPLICATION_MK:=Application.mk"
...
}
}
}
...
我重构了 Android.mk GSTREAMER_PLUGINS
字段并添加了 GSTREAMER_EXTRA_LIBS
。我用项目中使用的特定插件替换了类别,它解决了我的问题。
...
GSTREAMER_PLUGINS := coreelements udp rtpmanager rtp opengl playback
GSTREAMER_EXTRA_LIBS := -liconv
...
类别中的某些插件似乎存在错误
谢谢@NikolayKhilyuk 试图帮助我
在项目中更新:
Gstreamer 1.14.5 -> Gstreamer 1.18.0
NDKr16 -> NDKr21.3.6528147
构建:gradle:3.5.3 -> build:gradle:4.1.0
buildToolsVersion 29.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)
...
项目构建正确,但是当我 运行 应用程序崩溃时出现问题
Android.mk 文件:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := client
LOCAL_SRC_FILES := client.c
LOCAL_SHARED_LIBRARIES := gstreamer_android
LOCAL_LDLIBS := -llog -landroid
include $(BUILD_SHARED_LIBRARY)
ifndef GSTREAMER_ROOT_ANDROID
$(error GSTREAMER_ROOT_ANDROID is not defined!)
endif
ifeq ($(TARGET_ARCH_ABI),armeabi)
GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/arm
else ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/armv7
else ifeq ($(TARGET_ARCH_ABI),arm64-v8a)
GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/arm64
else ifeq ($(TARGET_ARCH_ABI),x86)
GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/x86
else ifeq ($(TARGET_ARCH_ABI),x86_64)
GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/x86_64
else
#$(error Target arch ABI not supported: $(TARGET_ARCH_ABI))
GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/armv7
endif
GSTREAMER_NDK_BUILD_PATH := $(GSTREAMER_ROOT)/share/gst-android/ndk-build/
include $(GSTREAMER_NDK_BUILD_PATH)/plugins.mk
GSTREAMER_PLUGINS := $(GSTREAMER_PLUGINS_CORE) \
$(GSTREAMER_PLUGINS_CODECS) \
$(GSTREAMER_PLUGINS_EFFECTS) \
$(GSTREAMER_PLUGINS_NET) \
$(GSTREAMER_PLUGINS_CAPTURE) \
$(GSTREAMER_PLUGINS_PLAYBACK) \
$(GSTREAMER_PLUGINS_SYS)
GSTREAMER_EXTRA_DEPS := gstreamer-video-1.0
include $(GSTREAMER_NDK_BUILD_PATH)/gstreamer-1.0.mk
Application.mk 文件:
APP_STL := c++_shared
APP_PLATFORM := android-26
我在文档中找到注释 https://developer.android.com/ndk/guides/cpp-support#c_runtime_libraries:
libc++ is not a system library. If you use libc++_shared.so, it must be included in your APK. If you're building your application with Gradle this is handled automatically.
我知道它构建不正确,因为我的 APK 不包含库
如何使用 gradle 以编程方式将 libc++_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'
...
看起来像 targets "client"
问题。尝试完全删除它或指定 NDK_APPLICATION_MK
:
...
externalNativeBuild {
ndkBuild {
...
targets "client"
arguments "NDK_APPLICATION_MK:=Application.mk"
...
}
}
}
...
我重构了 Android.mk GSTREAMER_PLUGINS
字段并添加了 GSTREAMER_EXTRA_LIBS
。我用项目中使用的特定插件替换了类别,它解决了我的问题。
...
GSTREAMER_PLUGINS := coreelements udp rtpmanager rtp opengl playback
GSTREAMER_EXTRA_LIBS := -liconv
...
类别中的某些插件似乎存在错误
谢谢@NikolayKhilyuk 试图帮助我