我需要拍摄照片文件和音频文件并制作视频。 我知道可以在
的帮助下完成Runtime.getRuntime().exec("ffmpeg -i image.jpeg -i audio.mp3 out.avi")
但仅适用于root设备,因此我尝试从ffmpeg.c为main()创建JNI包装器,并从我的Activity中调用它,如: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.这在我的活动中:
FFmpegCreator f = new FFmpegCreator ();
new Thread(f).start();
但我有
E/AndroidRuntime(25682): java.lang.UnsatisfiedLinkError: Java_com_ccmedia_codec_ffmpeg_mod_1run .
我无法理解为什么...... FFmpeg构建成功了...... 有人可以帮帮我吗?如果你能帮助我,我真的很感激。谢谢。
答案 0 :(得分: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.yourpackage
替换为FFmpegCreator
所在的包。如果您查看它生成的FFmpegCreator.h
,它将包含您的原生方法的正确签名。