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. PHP学习笔记之markdown
  2. markdown以及emmet语法
  3. Markdown最基础语法
  4. markdown常用语法与emmet常用语法
  5. Android(安卓)沉浸式状态栏实现
  6. Android自定义属性时TypedArray的使用方
  7. android的 UI 布局总结
  8. Android(安卓)wifi
  9. 安卓知道多少
  10. android 如何调用系统拨打电话的功能