开发者社区> 雪梦科技> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

在Android中通过jni方式使用编译好的FFmpeg库-Android中使用FFmpeg媒体库(二)

简介:
+关注继续查看

原文:http://doandroid.info/?p=471

在继上篇在32位的Ubuntu 11.04中为Android NDK r6编译FFmpeg最新版0.8.1后,本人来给大家展示一下如何在Android中使用编译好的FFmpeg库。


整体调用逻辑为:
1 编译完ffmpeg库
2 使用jni方式撰写c代码,其中需要包含相应的ffmpeg的头文件
3 撰写相应的Android.mk文件,里面指定需要编译的c代码以及需要链接的动态库
4 执行ndk-build生成相应的jni库
5 创建andorid java程序,代码中loadLibrary相应ffmpeg库以及刚才生成的jni库
6 静态方法声明native函数,这些函数在jni写的c语言中都已经实现过

下面为步骤:
1 将在32位的Ubuntu 11.04中为Android NDK r6编译FFmpeg最新版0.8.1文中编译得到的libffmpeg.so文件拷贝到/root/develop/android-ndk-r6/platforms/android-8/arch-arm/usr/lib目录,如果使用的是Android2.3的话,还需有拷贝到/root/develop/android-ndk-r6/platforms/android-9/arch-arm/usr/lib目录。

2 进入Android NDK r6的samples目录,我们基于最简单的hello-jni来修改。由于我们在调用ffmpeg库方法时候,需要使用到他的头文件。这里我们将之前编译libffmpeg.so文件的所有代码拷贝到/root/develop/android-ndk-r6/samples/目录,并改目录名称为ffmpeg

3 修改hello-jni.c文件

/*
 * Copyright (C) 2009 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */
#include <string.h>
#include <stdio.h>
#include <android/log.h>
#include <stdlib.h>
#include <jni.h>
//注意这里,需要在当前目录包含的时候能够找到libavcodec/avcodec.h文件
#include <ffmpeg/libavcodec/avcodec.h>
/* This is a trivial JNI example where we use a native method
 * to return a new VM String. See the corresponding Java source
 * file located at:
 *
 *   apps/samples/hello-jni/project/src/com/example/HelloJni/HelloJni.java
 */
//这里的命名注意,相当于com.example.hellojni的HelloJni文件中的stringFromJNI函数
jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                                  jobject thiz )
{
    char str[25];
    sprintf(str, "%d", avcodec_version()); 
 
    return (*env)->NewStringUTF(env, str);
}

4 修改Android.mk文件

LOCAL_PATH := $(call my-dir)
 
include $(CLEAR_VARS)
PATH_TO_FFMPEG_SOURCE:=$(LOCAL_PATH)/ffmpeg
LOCAL_C_INCLUDES += $(PATH_TO_FFMPEG_SOURCE)
LOCAL_LDLIBS := -lffmpeg
LOCAL_MODULE    := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)

注意LOCAL_LDLIBS := -lffmpeg是编译添加动态链接库文件。

5 进入命令行,在当前目录执行ndk-build

6 这时候会在/root/develop/android-ndk-r6/samples/hello-jni/libs/armeabi目录生成一个libhello-jni.so的动态链接库

7 为了后面的java程序能够loadLibrary,需要将之前生成的libffmpeg.so文件也拷贝到这个目录

8 修改HelloJni.java文件

package com.example.hellojni;
 
import android.app.Activity;
import android.widget.TextView;
import android.os.Bundle;
 
public class HelloJni extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        TextView  tv = new TextView(this);
        tv.setText( "1111" );
        //System.out.println();
        setContentView(tv);
        tv.setText(String.valueOf(stringFromJNI()));
    }
 
    public native String  stringFromJNI();
 
    static {
          System.loadLibrary("ffmpeg");
        System.loadLibrary("hello-jni");
    }
}

执行后将看到如下图片:

本文源代码下载:
hello-jni
对应的编译完的libffmpeg.so文件下载
libffmpeg.so

ffmpeg文件夹比较大,这里不发了。可以从上篇文章找到。
tq09931兄的文章表示感谢。

http://tq09931.iteye.com/blog/1011895

http://code.google.com/p/aacplayer-android/

http://www.roman10.net/?p=394

https://github.com/halfninja/android-ffmpeg-x264

https://github.com/mconf/ffmpeg

https://github.com/havlenapetr/FFMpeg

主参考

http://tq09931.iteye.com/blog/1011895

https://github.com/havlenapetr/FFMpeg

https://github.com/churnlabs/android-ffmpeg-sample



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
5篇论文入选国际顶会SIGMOD,阿里云&达摩院数据库技术研究再获认可
近日,ACM SIGMOD 2022在美国费城召开,阿里云数据库团队5篇论文入选,覆盖云原生、智能化、安全可信等数据库前沿研究方向。其中2篇为阿里云和达摩院的独立研究,体现了阿里云在数据库领域的自研成果达到了世界先进水平,得到了业界的广泛认可。
103 0
FastAPI 学习之路(二十九)使用(哈希)密码和 JWT Bearer 令牌的 OAuth2(下)
FastAPI 学习之路(二十九)使用(哈希)密码和 JWT Bearer 令牌的 OAuth2(下)
20 0
阿里云PolarDB论文入选数据库顶会SIGMOD2021 最新一代架构领先世界
阿里云研发的下一代云原生数据库PolarDB Serverless的论文被ACM SIGMOD录用,标志着阿里云PolarDB数据库在最新一代架构上领先于业界其他云厂商。
265 0
Android For JNI(二)——C语言中的数据类型,输出,输入函数以及操作内存地址,内存修改器
<div class="markdown_views"> <h1 id="android-for-jni二c语言中的数据类型输出输入函数以及操作内存地址内存修改器">Android For JNI(二)——C语言中的数据类型,输出,输入函数以及操作内存地址,内存修改器</h1> <hr> <blockquote> <p>当我们把Hello World写完之后,我们就可以迈
1366 0
Android For JNI(三)——C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值
<div class="markdown_views"> <h1 id="android-for-jni三c的指针指针变量指针常见错误值传递引用传递返回多个值">Android For JNI(三)——C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值</h1> <hr> <blockquote> <p>C中比较难的这一块,大概就是指针了,所以大家还是多翻阅一
1391 0
netstat统计的tcp连接数与⁄proc⁄pid⁄fd下socket类型fd数量不一致的分析
新blog地址: http://hengyunabc.github.io/netstat-difference-proc-fd-socket-stat/ 最近,线上一个应用,发现socket数缓慢增长,并且不回收,超过警告线之后,被运维监控自动重启了。
1766 0
+关注
雪梦科技
专注Android应用研发,性能优化,移动安全等领域。
457
文章
6
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载