簡體   English   中英

如何在Android應用程序中使用ffmpeg .so文件

[英]How to use ffmpeg .so file in Android application

我已經編譯了ffmpeg代碼並生成了.so文件,然后將這些.so文件放在jniLibs / armeabi /文件夾中。

要在下面的代碼中使用它:

Controller.java
public class Controller {

    static {
        System.loadLibrary("avutil");
        System.loadLibrary("swresample");
        System.loadLibrary("avcodec");
        System.loadLibrary("avformat");
        System.loadLibrary("swscale");
        System.loadLibrary("avfilter");
        System.loadLibrary("avdevice");
    }

    public static native void runffmpegCommand(String[] argv);

    public static void testFFMPEG(String[] strings) {
        runffmpegCommand(new String[]);
    }
}

ffmpeg_controller.c

#include <android/log.h>
#include "ffmpeg_Controller.h"
#include <stdlib.h>
#include <stdbool.h>
int main(int argc, char **argv);
JavaVM *sVm = NULL;
jint JNI_OnLoad( JavaVM* vm, void* reserved )
{
    sVm = vm;
    return JNI_VERSION_1_6;
}
JNIEXPORT void JNICALL Java_com_test_Controller_runffmpegCommand(JNIEnv *env, jobject obj, jobjectArray args)
{
    int i = 0;
    int argc = 0;
    char **argv = NULL;
    jstring *strr = NULL;
    if (args != NULL) {
        argc = (*env)->GetArrayLength(env, args);
        argv = (char **) malloc(sizeof(char *) * argc);
        strr = (jstring *) malloc(sizeof(jstring) * argc);
        for(i=0;i<argc;i++) { strr[i] = (jstring)(*env)->GetObjectArrayElement(env, args, i);
            argv[i] = (char *)(*env)->GetStringUTFChars(env, strr[i], 0);
        }
    }
    main(argc, argv);
    for(i=0;i<argc;i++) {
     (*env)->ReleaseStringUTFChars(env, strr[i], argv[i]);
    }
    free(argv);
    free(strr);
}

ffmpeg_controller.h

#include <jni.h>
#ifndef _Included_com_test_Controller
#define _Included_com_test_Controller
#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT void JNICALL Java_com_android_com_test_Controller_runffmpegCommand(JNIEnv *, jobject, jobjectArray);
#ifdef __cplusplus
}
#endif
#endif

當我運行此代碼時,出現以下錯誤:

日志:

2018-12-17 14:11:17.850 25598-25598 / com.android.test E / AndroidRuntime:致命異常:主進程:com.android.test,PID:25598 java.lang.UnsatisfiedLinkError:dlopen失敗:“ / data /app/com.android.test-1/lib/arm/libavutil.so“是64位而不是java.lang.System上的java.lang.Runtime.loadLibrary0(Runtime.java:989)上的32位。調用LoadLibrary(System.java:1530)

我認為這是她的問題,因為您使用targetSdkVersion 26或更高版本運行應用程序,所以我認為解決方案是她的樣子:

https://stackoverflow.com/a/52951886/7055487

異常是不言自明的:“ libavutil.so是64位而不是32位”:您已經在“ jniLibs”子文件夾中復制了一個64位庫,該子文件夾需要32位庫。

“ jniLibs / armeabi”子文件夾僅適用於32位設備

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM