1

我尝试构建库并获得:

undefined reference to 'main' collect2: ld returned 1 exit status

这是我在 jni 文件夹中添加的 .c 文件:

#include <stdlib.h>
#include "creator.h"

// Use to safely invoke ffmpeg multiple times from the same Activity
JNIEXPORT void JNICALL Java_com_appunite_ffmpeg_FFmpegCreator_run(JNIEnv *env, jobject obj, jobjectArray args)
{
int i = 0;
int argc = 0;
char **argv = NULL;

if (args != NULL) {
    argc = (*env)->GetArrayLength(env, args);
    argv = (char **) malloc(sizeof(char *) * argc);

    for(i=0;i<argc;i++)
    {
        jstring str = (jstring)(*env)->GetObjectArrayElement(env, args, i);
        argv[i] = (char *)(*env)->GetStringUTFChars(env, str, NULL);
    }
}

main(argc, argv);
}

这是一个 .h 文件:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_appunite_ffmpeg_FFmpegCreator */

#ifndef _Included_com_appunite_ffmpeg_FFmpegCreator
#define _Included_com_appunite_ffmpeg_FFmpegCreator
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_appunite_ffmpeg_FFmpegCreator
 * Method:    run
 * Signature: ([Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_com_appunite_ffmpeg_FFmpegCreator_run(JNIEnv *, jobject, jobjectArray);

#ifdef __cplusplus
}
#endif
#endif

当我评论 main(argc, argv) - 构建成功,否则 - 得到这个错误。有人可以帮我吗?

4

1 回答 1

1

https://github.com/jhotovy/android-ffmpeg/blob/master/Project/jni/ffmpeg_android/ffmpeg_android.c中的解决方案有点奇怪。

它作为 Java 程序运行,调用 中的 C 代码ffmpeg_android.c,然后该代码调用 ffmpeg Cmain方法(与直接从命令行运行 ffmpeg 时调用的方法相同)。这可能不是实现您想要的最佳方式。理想情况下,您将使用 ffmpeg API(如libavcodec)进行编码/解码。

尽管如此,您的方法应该仍然有效,我怀疑您收到链接错误的原因是因为您没有在 ffmpeg 代码中进行链接。您可以发布您正在运行的命令来构建 C 代码吗?确保您在源代码中包含 ffmpeg 源代码,或者您的链接行中有-lffmpeg某个位置。

于 2013-03-13T18:47:56.813 回答