1.首先是要用android NDK编译好ffmpeg 生成5M左右的链接库(参考前一篇文章),并放在对应现使用平台目录下,如C:\android-ndk-r6\platforms\android-9\arch-arm\usr\lib
2.新建一个android程序,api要和上面对应,如andorid-9 新建jni文件夹,进入,把之前编译好的ffmpeg代码放进去重名为ffmpeg文件夹。并在jni新建Android.mk文件,和ffmpegtest.c文件,内容如下:
3.然后使用nkd命令编译:
./ndk-build -C /home/s_jrvin/workspace/jnitest
在工程根目录下的Libs\armeabi\下生成了libjnitest.so。成功。。呵呵。。
然后把libffmpeg.so 拷到工程根目录下的Libs\armeabi\下。
运行 android程序,成功打印log信息。
主程序.java
- <span style="font-size:18px;">package vplayer.test;
-
- import android.app.Activity;
- import android.os.Bundle;
- import android.util.Log;
-
- public class vplayer extends Activity {
- public native int version();
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
-
- int x = version();
- Log.d("version", String.valueOf(x));
- }
-
- static
- {
- System.loadLibrary("ffmpeg");
- System.loadLibrary("jnitest");
- }
- }</span>
Android.mk:
- <span style="font-size:18px;">LOCAL_PATH := $(call my-dir)
- include $(CLEAR_VARS)
-
- LOCAL_MODULE := jnitest
- LOCAL_SRC_FILES := ffmpegtest.c
- LOCAL_C_INCLUDES += $(LOCAL_PATH)/ffmpeg/ $(LOCAL_PATH)/ffmpeg/libavutil/ $(LOCAL_PATH)/ffmpeg/libavcodec/ $(LOCAL_PATH)/ffmpeg/libavformat/ $(LOCAL_PATH)/ffmpeg/libavcodec/ $(LOCAL_PATH)/ffmpeg/libswscale/
- LOCAL_LDLIBS +=-lffmpeg
- include $(BUILD_SHARED_LIBRARY)</span>
PATH_TO_FFMPEG_SOURCE:=$(LOCAL_PATH)/ffmpeg
这行是定义一个变量,也就是ffmpeg源码的路径
LOCAL_C_INCLUDES += $(PATH_TO_FFMPEG_SOURCE)
这行是指定源代码的路径,也就是刚才拷过去的ffmpeg源码,$(LOCAL_PATH)是根目录,如果没有加这行那么引入ffmpeg库中的h文件编译就会出错说找不到该h文件。
LOCAL_LDLIBS := -lffmpeg
这行很重要,这是表示你这个so运行的时候依赖于libffmpeg.so这个库, 再举个例子:如果你要编译的so不仅要用到libffmpeg.so这个库还要用的libopencv.so这个库的话,你这个参数就应该写成
LOCAL_LDLIBS := -lffmpeg -lopencv
其他的参数都是正常的ndk编译用的了,不明白的话google一下。
ffmpegtest.c
- <span style="font-size:18px;">#include <jni.h>
- #include <stdio.h>
-
- JNIEXPORT jint JNICALL Java_vplayer_test_vplayer_version
- (JNIEnv *evn, jobject obj)
- {
- return (int)avcodec_version();
- }</span>