2013-03-13 87 views
1

我嘗試建立圖書館,並得到:FFmpeg的:未定義的引用「主」

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

這是一個.c文件我在JNI文件夾補充說:

#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) - 構建成功,否則 - 出現此錯誤。 任何人都可以幫助我嗎?

+0

你想在這裏做什麼? 'main'通常不會被你的代碼調用 - 它是你程序的入口點。你是否試圖從Java調用這個C++代碼?在這種情況下,你的'main'應該放在一個'.java'文件中,你將使用'$ java JavaFileName.java'運行你的程序。 您正在收到鏈接錯誤,因爲您正在調用'main'而未定義它。 – Blake 2013-03-13 15:16:47

+0

定義的'main'函數在哪裏?共享對象沒有與應用程序相同的「main」函數,所以如果您基於某些示例代碼,應該嘗試找到爲Android編寫的內容。 – Michael 2013-03-13 15:19:35

+0

您是否定義了「主」功能?該代碼只准備argc和argv並將它們傳遞給main()。 – 2013-03-13 15:19:40

回答

1

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

它作爲Java程序運行,調用ffmpeg_android.c中的C代碼,該代碼調用ffmpeg C main方法(與直接從命令行運行ffmpeg時調用的方法相同)。這可能不是實現你想要的最好方法。理想情況下,您可以使用ffmpeg API(如libavcodec)來進行編碼/解碼。

儘管如此,你的方法應該仍然有效,我懷疑你得到鏈接錯誤的原因是因爲你沒有在ffmpeg代碼中鏈接。你能發佈你正在運行的命令來構建C代碼嗎?確保您要麼在源代碼中包含ffmpeg源代碼,要麼在鏈接線的某處有-lffmpeg

+0

謝謝你的回覆!我使用這個庫:https://github.com/appunite/AndroidFFmpeg。並以這樣的方式構建它。但是在Android.mk和build_android.sh中我找不到任何-lffmpeg。我應該在Android.mk中添加它嗎? – 2013-03-13 20:10:40

+0

不,「Android.mk」已包含ffmpeg對象文件。如果你在沒有JNI源代碼的情況下運行'build_android.sh',它會生成OK嗎? – Blake 2013-03-13 20:23:12

+0

是的,如果我對main(argc,argv)進行註釋,它會生成ok,沒有任何錯誤。 – 2013-03-13 20:26:44