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 に答える