2013-03-12 61 views
0

我需要拍攝圖片文件和音頻文件並創建視頻。 我知道,它可能與FFmpeg:調用Runnable時java.lang.UnsatisfiedLinkError類

Runtime.getRuntime().exec("ffmpeg -i image.jpeg -i audio.mp3 out.avi") 

但只幫助了紮根設備做的,所以我試圖從ffmpeg.c創建主JNI包裝(),並從我的活動稱呼它在這裏:http://demo860.blogspot.com/2010/07/android-ffmpeg-dynamic-module-jni.html

1.本代碼是在ffmpeg.c:

int m_argc = 0; 
char *m_pargv [30]; 

int dynamic_ffpmeg_main (int argc, char **argv); 
jint JNICALL Java_com_ccmedia_codec_ffmpeg_mod_1run (JNIEnv *, jclass, jstring,  jstring); 

jint JNICALL Java_com_ccmedia_codec_ffmpeg_mod_1run (JNIEnv *env, jclass class, jstring pj1, jstring pj2) 
{ 
    // as in http://demo860.blogspot.com/2010/07/android-ffmpeg-dynamic-module-jni.html 
} 

int dynamic_ffpmeg_main(int argc, char **argv) 
{ 
// as in http://demo860.blogspot.com/2010/07/android-ffmpeg-dynamic-module-jni.html 
} 

int main(int argc, char **argv) 
{ 
    dynamic_ffpmeg_main (argc, argv); 
    return 0; 
} 

2,本代碼是在我的.java:

public class FFmpegCreator implements Runnable { 

    static boolean m_bret = false; 
static String m_szconfig = " -i /sdcard/file.mpg -vcodec mpeg4 aaa.mpg"; 

//public native String unimplementedStringFromJNI(); 

static { 
    try { 

     System.out.println("[AdDBCache] Module load try ffmpeg : " 
       + System.getProperty("java.library.path")); 

     // System.load("/sdcard/arm_and/bin/libffmpeg.so"); 

     System.loadLibrary("ffmpeg"); 

     System.out.println("[AdDBCache] Module load success"); 

    } 

    catch (Exception e) { 

     System.out.println("[AdDBCache] Module load err : " 
       + System.getProperty("java.library.path")); 

    } 

} 

private static synchronized final native int Java_com_ccmedia_codec_ffmpeg_mod_1run(String name, String sztoken); 

public void set_config(String sz_config) { 

    m_szconfig = sz_config; 

} 

public void run_core(String sz_file, String sz_token) { 

    int n_stat; 
    m_bret = false; 
    n_stat = Java_com_ccmedia_codec_ffmpeg_mod_1run(m_szconfig, sz_token); 
    m_bret = true; 

} 

public void run() { 

    run_core("", ""); 

} 
} 

3.And這在我的活動:

FFmpegCreator f = new FFmpegCreator(); 
new Thread(f).start(); 

但我有

E/AndroidRuntime(25682): java.lang.UnsatisfiedLinkError: Java_com_ccmedia_codec_ffmpeg_mod_1run . 

而且我不明白爲什麼... FFmpeg的構建成功... 誰能幫我, 請?如果你能幫助我,我會非常感激。謝謝。

回答

1

問題是Java端本地方法Java_com_ccmedia_codec_ffmpeg_mod_1run的命名。你應該給它一個普通的方法名稱,不要包含所有的Java_package ...部分。然後,爲了將其與C函數匹配,您需要使用該方法所屬的包和類。最萬無一失的方法,這樣做是爲了更新Java側第一:

public class FFmpegCreator implements Runnable { 
    // ... 

    private static synchronized final native int mod_1run(String name, String sztoken); 

    //... 
} 

,然後運行的類javah

$ javah -o FFmpegCreator.h -classpath bin/classes com.yourpackage.FFmpegCreator 

(與目錄替換bin/classes您的.class文件被編譯,並且com.yourpackageFFmpegCreator在其中的包)。如果您查看FFmpegCreator.h它會生成它將包含您的本地方法的正確簽名。

+0

非常感謝你的回覆。我按你所說的完成了。給出了一個正常的名字,生成.h,但我仍然有相同的錯誤。 – 2013-03-13 07:04:04

+0

你更新了你的'ffmeg.c'來使用你在生成的.h文件中看到的簽名嗎?使用javah生成.h文件只是爲了向您說明此方法的簽名需要在C端,您仍需要更新C代碼才能使用該簽名。 – 2013-03-13 07:29:55

+0

是的,我did.I得到JNIEXPORT jint JNICALL java_com_appunite_ffmpeg_FFmpegCreator_mod_1run (JNIEnv *,jclass,jstring,jstring);並用.j替換JNICALL java_com_appunite_ffmpeg_FFmpegCreator_mod_1run (JNIEnv *,jclass,jstring,jstring) – 2013-03-13 07:45:48

相關問題