android - 如何在 Android 上链接 .so 库

标签 android ffmpeg

我正在尝试将 FFMpeg 与 Android 一起使用。首先,我尝试在我的 Mac 上构建 FFMpeg,但我做不到。我在互联网上检查了许多解决方案,但没有一个有效。因此,我尝试在 Ubuntu 12.04 上构建 FFMpeg。我尝试了很多解决方案,但最终我找到了this示例,我成功构建了它。然后我得到头文件和 .so 文件。然后我将它们全部复制到我的 Mac 上并尝试在我的项目中使用它。我将此文件复制到我的项目中。现在我的项目树看起来像这样:

picture

这是我的 Android.mk 文件:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := avformat
LOCAL_SRC_FILES := libavformat.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include/libavformat
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE    := ndksetup
LOCAL_SRC_FILES := native.c
LOCAL_LDLIBS := -llog
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include

include $(BUILD_SHARED_LIBRARY)

这是我的 Application.mk 文件:
APP_MODULES := ndksetup
APP_PLATFORM := android-8
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libavformat.so

这是我的 natice.c 文件:
#include <jni.h>
#include <string.h>
#include <android/log.h>
#include "include/libavcodec/avcodec.h"
#include "include/libavformat/avformat.h"

#define DEBUG_TAG "NDKSetupActivity"

void Java_com_example_ndksetup_MainActivity_printLog(JNIEnv *env, jobject this,
        jstring logString) {
    av_register_all();
    jboolean isCopy;
    const char * szLogString = (*env)->GetStringUTFChars(env, logString,
            &isCopy);

    __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "NDK: %s", szLogString);

    (*env)->ReleaseStringUTFChars(env, logString, szLogString);
}

jint Java_com_example_ndksetup_MainActivity_fibonacci(JNIEnv * env,
        jobject this, jint value) {
    if (value <= 1)
        return value;
    return Java_com_example_ndksetup_MainActivity_fibonacci(env, this,
            value - 1)
            + Java_com_example_ndksetup_MainActivity_fibonacci(env, this,
                    value - 2);
}

我收到错误
[armeabi] SharedLibrary  : libndksetup.so
/Applications/adt-bundle-mac-x86_64-20140321/sdk/ndk/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: /Users/michal/Desktop/NDKSetup/obj/local/armeabi/objs/ndksetup/native.o: in function Java_com_example_ndksetup_MainActivity_printLog:/Users/michal/Desktop/NDKSetup/jni/native.c:11: error: undefined reference to 'av_register_all'
collect2: ld returned 1 exit status
make: *** [/Users/michal/Desktop/NDKSetup/obj/local/armeabi/libndksetup.so] Error 1

我真的不知道如何处理它。你能告诉我我做错了什么,我该如何解决?或者也许还有另一种在 Android 中使用 .so 库的方法

最佳答案

LOCAL_SRC_FILES应用程序.mk 什么也没做。但是你应该添加

LOCAL_SHARED_LIBRARIES += avformat

ndksetup 选择您的安卓.mk .

关于android - 如何在 Android 上链接 .so 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24122709/

相关文章:

android - 如何在Android中显示录制时间?

linux - 桌面录制时的视频质量较差

javascript - 如何使用 FFmpeg.wasm 验证视频文件

php - 如何使用 php 和 ffmpeg 将歌曲剪切到前 30 秒

Android - 在 RecyclerView 中锁定项目

java.lang.NoSuchMethodError : No virtual method toString(Z)Ljava/lang/String; in class Lokhttp3/Cookie; or its super classe

java - Android - 无法从静态上下文中引用 executePendingTransactions

android - Dagger 和对所提供类的依赖

android - ffmpeg:Android 上的某些播放器对视频持续时间感到困惑

ffmpeg 在太糟糕的 TS 流上失败