android / ffmpeg dynamic module, JNI simple wrapper

On production device, we can't use "executable file ".

we need to build "dynamic, SO module" for ffmpeg/ ffserver.

This post explain how to build SO module and simple JNI interface for ffmpeg.

1) change ffmpeg.c

a) add JNI part.


////////////////////////////////////////////////////////////////////////////////////////////////////////////


// KKS ...

#include

int m_argc = 0;

int M_MAX_ARGC = 30;

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) {

jint ji;

jboolean ic;



char sz_temp [1024];

char seps [] = " ";

char *psztoken, *pszdata;

int i = 0;



const char *pszname;

pszname = (*env)->GetStringUTFChars(env, pj1, &ic);



sprintf ( sz_temp, "ffmpeg %s ", pszname );



if ( ic == JNI_TRUE ) (*env)->ReleaseStringUTFChars(env, pj1, pszname);

// strcpy ( sz_temp, "ffmpeg -i /sdcard/arm_and/bin/tv_dump.mpg http://localhost:8090/feed1.ffm " );



printf ( "[DEBUG] %s/n", sz_temp );



psztoken = strtok ( sz_temp, seps );

while ( psztoken != NULL ) {



m_pargv [ m_argc] = ( char *)malloc ( strlen ( psztoken));

strcpy ( m_pargv [ m_argc], psztoken );

m_argc++;

psztoken = strtok ( NULL, seps);

}



for ( i = 0; i < m_argc; i++ ) {

printf ( "argc[%d] = %s/n", i, m_pargv[i]);

}



dynamic_ffpmeg_main ( m_argc, m_pargv );



ji = 0;



return ji;



}

b) change main function
original --> int main (int argc, char **argv )

new --> int dynamic_ffpmeg_main (int argc, char **argv )

c) add " new main function "

int main(int argc, char **argv)


{


dynamic_ffpmeg_main ( argc, argv );


return 0;

}

2) build ffmpeg .


- on preivious post, you can find "configure" option to build ffmpeg.


http://demo860.blogspot.com/2010/06/ffmpeg-libx264-build-for-android.html

3) build ffmpeg SO module using following command.

i use NDK r4 , /export/home/android/ndk/


/export/home/android/ndk/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin/arm-eabi-gcc /


-nostdlib -Wl,-soname,libffmpeg.so -Wl,-shared,-Bsymbolic /

cmdutils.o ffmpeg.o /

-Wl,--no-whole-archive -Wl,--whole-archive /

/export/home/android/android-ndk-r4/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin/../lib/gcc/arm-eabi/4.4.0/libgcc.a /

/export/home/android/ndk/build/platforms/android-8/arch-arm/usr/lib/libc.so /

/export/home/android/ndk/build/platforms/android-8/arch-arm/usr/lib/libstdc++.so /

/export/home/android/ndk/build/platforms/android-8/arch-arm/usr/lib/libm.so /

/export/home/android/ndk/build/platforms/android-8/arch-arm/usr/lib/libz.so /

/export/home/android/ndk/build/platforms/android-8/arch-arm/usr/lib/libdl.so /

-Wl,--no-undefined -Wl,-z,noexecstack -Wl,-rpath-link=/export/home/android/ndk/build/platforms/android-8/arch-arm/usr/lib /

./libavutil/libavutil.a /

./libavcodec/libavcodec.a /

./libavfilter/libavfilter.a /

./libavformat/libavformat.a /

./libswscale/libswscale.a /

./libavdevice/libavdevice.a /

-o libffmpeg.so


4) now you can use using following ffmpeg wrapper.

public class ffmpeg 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 mod_run (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 = mod_run ( m_szconfig, sz_token );

m_bret = true;

}



public void run () {

run_core ( "", "");

}

}

5) ffmpeg / ffserver,

- i made both , dynamic module and run it.
- the speed is ok but it's use CPU so much.

1 comments:

Bryan :

hello, what does your ffmpeg make file look like?

Thanks!

更多相关文章

  1. 代码中设置drawableleft
  2. android 3.0 隐藏 系统标题栏
  3. Android开发中activity切换动画的实现
  4. Android(安卓)学习 笔记_05. 文件下载
  5. Android中直播视频技术探究之—摄像头Camera视频源数据采集解析
  6. 技术博客汇总
  7. android 2.3 wifi (一)
  8. AndRoid Notification的清空和修改
  9. Android中的Chronometer

随机推荐

  1. (转)android SQLite的使用
  2. Android的交叉编译工具
  3. Android的建议
  4. 这是一份全面 & 详细的Android学习指南
  5. Android(安卓)USB 开发详解
  6. Android(安卓)API版本对应Android系统版
  7. Android快速开发框架-------afinal
  8. Android入门教程 (一) Android简介和androi
  9. Android(安卓)内存管理
  10. 4.0.x Launcher UI