gpt4 book ai didi

安卓工作室 NDK 等级 : Cannot find share library

转载 作者:行者123 更新时间:2023-11-30 00:35:04 27 4
gpt4 key购买 nike

我正在 Android Studio 中使用 NDK 开发 ffmpeg JNI。我在 Android Studio 之外用 NDK 构建了 ffmpeg,并将库放在 src/main/jni/libs/armeabi-v7a。 接下来,我生成了 JNI 头文件并通过调用 avformat API 来实现它。但是,链接器最终无法找到 libavformat.so,如以下消息所示。

"/Users/xxx/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/arm-linux-androideabi/bin/ld错误:错误:找不到-lavformat”

这是我制作的build.gradle。我在 ldLibs 中添加了“avformat”,但看起来 gradle 不知道 lib 路径。我没有找到哪个 gradle 选项可以指定它。我使用的是 gradle distribution 3.3,而它与旧的 gradle 版本 2.10 有同样的问题。 感谢对此的任何评论。

apply plugin: 'com.android.application'

android {
compileSdkVersion 25
buildToolsVersion '25.0.2'

defaultConfig {
applicationId "xxx.example.com.ffmpegtestapp"
minSdkVersion 24
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

ndk {
moduleName "jnilib"
ldLibs "log", "avformat"
cFlags "-I${project.buildDir}/../src/main/jni/include"
abiFilters "armeabi-v7a"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
sourceSets.main {
jni.srcDirs = ['src/main/jni']
jniLibs.srcDirs = ['src/main/jni/libs']
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
testCompile 'junit:junit:4.12'
}

最佳答案

我刚刚开始工作并在这里分享。我需要创建 CMakeLists.txt 让 cmake 为我构建和链接 native 库,并指定外部共享库路径。

https://developer.android.com/studio/projects/add-native-code.html#create-cmake-script

cmake_minimum_required(VERSION 3.4.1)

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")

add_library(jnilib SHARED
native_lib.c)

target_include_directories(jnilib PRIVATE
../include)

add_library(avformat SHARED IMPORTED)
set_target_properties(avformat PROPERTIES IMPORTED_LOCATION
${CMAKE_SOURCE_DIR}/../libs/${ANDROID_ABI}/libavformat.so)

target_link_libraries(jnilib
android
log
avformat)

build.gradle是这样的,加上了externalNativeBuild。

apply plugin: 'com.android.application'

android {
compileSdkVersion 25
buildToolsVersion '25.0.2'

defaultConfig {
applicationId "xxx.example.com.ffmpegtestapp"
minSdkVersion 24
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

ndk {
moduleName "jnilib"
ldLibs "log", "avformat"
cFlags "-std=c++11 -I${project.buildDir}/../src/main/jni/include"
abiFilters "armeabi-v7a"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
sourceSets.main {
jni.srcDirs = ['src/main/jni']
jniLibs.srcDirs = ['src/main/jni/libs']
}
externalNativeBuild {
cmake {
path 'src/main/jni/src/CMakeLists.txt'
}
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
testCompile 'junit:junit:4.12'
}

除此之外,我在链接 libavformat.so 时发现“undefined definition”错误,最后我意识到我正在使用“native_lib.cpp”,这是一个试图链接 C 代码的 C++ 代码。

error: undefined reference to 'avformat_version()'

通过将 native_lib.cpp 重命名为 native_lib.c 解决,或者像这样为头文件添加外部“C”,

extern "C" {
#include <libavformat/avformat.h>
}

关于安卓工作室 NDK 等级 : Cannot find share library,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43568785/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com