Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何包含libc++_那么,是不是可以通过gradle以编程方式将shared.so导入我的APK?_Android_Gradle_Android Ndk_Gstreamer - Fatal编程技术网

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
...