`
kongweile
  • 浏览: 523131 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

使用ndk或linux下独立交叉编译(ffmpeg)

 
阅读更多

1、ndk 编译程序

  • 在NDK的apps目录下创建helloworld目录,并且创建相关文件,目录结构如下:

helloworld

–Application.mk

–project

   –jni

      –Android.mk

      –helloworld.c

Application.mk:

  1. APP_PROJECT_PATH := $(call my-dir)/project  
  2.   
  3. APP_MODULES       := helloworld  

Android.mk:

  1. LOCAL_PATH := $(call my-dir)  
  2.   
  3. include $(CLEAR_VARS)  
  4.   
  5. LOCAL_MODULE     := helloworld  
  6. LOCAL_SRC_FILES := helloworld.c  
  7.   
  8. #include $(BUILD_SHARED_LIBRARY)//编译动态库  
  9. include $(BUILD_EXECUTABLE)//编译可执行程序  

helloworld.c

  1. #include<stdio.h>  
  2.   
  3. int main(int argc, char *argv[])  
  4. {  
  5.    printf("Hello world!\n");  
  6.   return 0;  
  7. }</stdio.h>  

 

  • 编译生成可执行程序(我是在win32下使用cygwin)。启动cygwin,在shell下进入到代码所在的目录(NDK_ROOT),输入:“make APP=helloworld”。

image

 

 

 

 

 

 

 

在NDK_ROOT/apps/helloworld/project/libs/armeabi/目录有生成了“helloworld”可执行程序。到这里编译已经完成了。

 

  • 接下来就是把可执行程序复制到目标机器上,我的操作如下:

cd NDK_ROOT/apps/helloworld/project/libs/armeabi

adb push /data/helloworld

adb shell

chmod 777 /data/helloworld/helloworld

/data/helloworld/helloworld

如果没有权限问题,这里就OK了.

如果用windows cmd命令行下使用adb连接虚拟机会有权限问题,;我试着在 虚拟机上/Dev Tools/Terminal Emulator上用命令执行,也没有权限执行程序.可能只有cygwin使用的是root吧.

 

2、用传统交叉编译方式--也可以

* 在ubuntu 或标准linux下下载arm交叉编译工具

http://www.codesourcery.com/sgpp/lite/arm/portal/subscription?@template=lite

这个自己.做吧,别忘记export

* 编码,文件结构如下

--test

Makefile

include

    --pchar.h

src

    --main.c

    --pchar.c

代码分别如下:

//*********************************************main.c***********************************/

/*
* Copyright (C) 2009 The Android Open Source Project
*
mu maytures -- two test function
*
*/
//#include <stdio.h>
#include "pchar.h"

int main(int argc,char *argv[])
{
printf("===begin=!\n");
pchar();
printf("===end=!\n");

return 0;
}

//void _start(int argc, char **argv) { exit( main(argc, argv) ); }

//*********************************************pchar.c***********************************/

#include "pchar.h"
int pchar()
{
printf("I'm char.=!\n");
return 0;
}

//*********************************************pchar.h***********************************/

#include <stdio.h>
int pchar();

//*********************************************Makefile***********************************/

CC= arm-none-linux-gnueabi-gcc
EXE=test

all:$(EXE)

#CFLAGS= -Wall -O2 
INCLUDE = -I ./include

#LIB = -static -llib

#LIBPATH = -L./lib

LIB = -static

$(EXE):./src/*.c
#       $(CROSS_COMPILE)gcc -o $@ hello.c
        $(CC) ./src/*.c -o $@ $(INCLUDE) $(LIB)

clean:
        rm -rf test

*****************************************************************************************************************

注:-static一定要有.  

ok .. make 就可以了,

$file test

查看一下生成的可执行文件是不是arm 下,static的.

-static选项在这里是必须的,不然android平台就不运行此程序。

  这也说明了此平台上的C/C++库是不能被 C/C++程序动态连接的 。

  进入tools目录,用adb工具下载到android平台,放到/data/data目录。

[cmz@KD1 jni]$ file test
test: ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.6.14, statically linked, for GNU/Linux 2.6.14, not stripped

将生成的文件按(1)传入到虚拟机运行.就可以看到了.

 

3、ffmpeg移植到android.可以说用上面同样的方法。只是注意,要staitc的方式编译将生成的bin/ffmpeg二进制文件 ,传到虚拟机。

 

移到板子上 ffmpeg -i test.avs test.yuv

test.avs为测试文件.

 

 

 

 

 

 

  上面的应用程序在编译时必须加上-static选项,也就是在编译时将函数都静态编译到程序中了,运行时不用再动态连接。如果不加此选项,在 android平台上就不让运行。

  经过测试,将自己写的库放到/system/lib目录下,然后写个主程序来动态连接,也是无法运行。

  看来此平台做了限制,不让C/C++的程序运行时动态连接到这些C/C++库。

 

 

http://blog.chinaunix.net/u3/90973/showart_1958940.html    

分享到:
评论

相关推荐

    在Linux下编译FFmpeg+android ndk成功的脚本及so库

    本文将详细介绍如何在Linux系统下使用NDK编译FFmpeg,并生成适用于Android的.so库。主要涉及的知识点包括: 1. **FFmpeg框架**:FFmpeg提供了多种音视频编解码器,如H.264、AAC等,以及各种格式的容器支持,如MP4、...

    ubuntu 下 编译 ffmpeg for Android armv7-a armv8-a

    综上所述,"ubuntu下 编译 ffmpeg for Android armv7-a armv8-a"涉及到的知识点包括Ubuntu环境、FFmpeg项目、Android架构、交叉编译、NDK、配置脚本以及硬件加速等。通过这样的编译过程,我们可以创建针对Android...

    linux aarch64 ffmpegc gltransition 交叉编译so / a文件

    下面我们将详细讨论如何在Linux上交叉编译FFmpeg,特别是gltransition模块,以便生成适用于Android的动态链接库(.so)和静态链接库(.a)文件。 首先,确保你的开发环境已经配置了交叉编译工具链,例如Android NDK...

    Android FFmpeg NDK 25.2.9519653 .so编译库

    交叉编译FFmpeg的过程涉及以下步骤: 1. **配置环境**:首先,你需要安装Android NDK并设置好环境变量,如ANDROID_NDK_ROOT。然后,安装msys2和mingw64,确保拥有合适的编译工具。 2. **获取FFmpeg源码**:从...

    android成功编译ffmpeg0.6

    总的来说,成功编译FFmpeg 0.6 for Android需要对Android NDK、交叉编译、JNI以及FFmpeg自身有深入理解。通过以上步骤,我们可以将FFmpeg集成到Android应用中,实现音视频的处理和播放功能。文件名`JNI_FFmpeg`可能...

    NDK开发——FFmpeg在Linux下编译、移植命令行、合并音视频.zip

    FFmpeg是一款开源的跨平台多媒体处理...总结,NDK开发FFmpeg涉及到Linux下的编译、Android的移植以及音视频处理命令行的使用。通过以上步骤,开发者可以将FFmpeg集成到Android应用中,实现高效且灵活的音视频处理功能。

    编译好ffmpeg so 文件用于安卓

    NDK是开发Android原生代码所必需的,它提供了交叉编译工具链和必要的库。 2. **获取FFmpeg源码**:从FFmpeg的官方仓库克隆源码,通常使用`git clone https://github.com/FFmpeg/FFmpeg.git`。 3. **配置编译选项**...

    ffmpeg ndk编译目录结构以及Android.mk

    本文将详细探讨FFmpeg在Android环境下使用NDK的编译目录结构以及`Android.mk`文件的配置。 首先,让我们理解FFmpeg的编译目录结构。在Android NDK开发中,项目通常遵循以下结构: 1. **jni**:这是Android NDK项目...

    Android编译ffmpeg+测试工程

    1. **配置FFmpeg**:使用`./configure`命令,添加`--target-os=android`参数,并指定Android交叉编译工具链路径,例如: ``` ./configure --prefix=/path/to/output --target-os=android --arch=armv7a --cpu=...

    编译ffmpeg生成的库文件,Android和Linux版本

    例如,为了生成Android版本的库,开发者需要使用NDK交叉编译,并指定正确的ABI(Application Binary Interface)。 3. **Linux动态链接库与静态链接库** 动态链接库(.so文件)在运行时被加载到进程内存中,多个...

    ffmpeg全平台编译

    对于Android平台,还需要安装NDK(Native Development Kit),用于交叉编译。 2. **配置FFmpeg**: 使用`./configure`命令进行配置,这是一个非常关键的步骤,因为它会根据指定的参数来决定FFmpeg的功能和编译方式...

    ffmpeg编译结果

    2. **配置环境**:设置Cygwin的路径变量,确保能访问到NDK的交叉编译工具链,同时配置NDK的路径。 3. **配置FFmpeg**:使用`./configure`命令进行FFmpeg的配置,指定目标平台为Android,例如: ``` ./configure -...

    ExoPlay扩展ffmpeg编译so库

    2. **交叉编译**: 由于Android设备使用的是不同于桌面系统的Linux变体,所以需要使用交叉编译工具链来构建.so文件。这通常涉及到设置NDK(Native Development Kit)环境,并使用NDK的`ndk-build`或CMake来编译。 3....

    编译ffmpeg android arm64版

    总结,编译FFmpeg Android arm64版涉及的知识点包括:FFmpeg框架、Android NDK、交叉编译、配置构建选项、JNI接口、CMakeLists语法、Android权限管理和多媒体处理。通过这个过程,开发者可以为Android设备构建高效的...

    ffmpeg for Android包含头文件和编译好的so库 可直接使用

    通常,开发者会在Linux环境下编译FFmpeg,因为它的编译工具链和Android的交叉编译环境更为兼容。这里的编译过程可能包括了配置选项,如选择特定的编解码器、过滤器和协议,以满足Android平台的需求。 标签“Android...

    安卓交叉编译ffmepgx86_64版本

    交叉编译意味着在一种环境下(通常是Linux)编译代码,以在另一种不同的目标环境(这里是Android设备)上运行。以下将详细介绍这个过程。 1. **交叉编译环境设置** - 首先,你需要一个装有Linux操作系统的主机,...

    android-ndk(android-ndk-r26b-linux.zip)

    3. **交叉编译**:NDK包含了一系列的交叉编译工具链,使得开发者可以在Linux主机上编译出针对不同Android架构(如armeabi-v7a, arm64-v8a, x86, x86_64等)的原生库。 4. **性能优化**:对于计算密集型或资源敏感的...

    android-ndk(android-ndk-r23b-linux.zip)

    在Android应用开发中,NDK扮演着至关重要的角色,它允许开发者使用原生代码(如C和C++)来编写部分应用,以提升性能或利用特定硬件功能。 NDK的主要用途包括: 1. **性能优化**:对于计算密集型任务,如图形处理、...

    ijkplayer ffmpeg android独立编译.docx

    总之,ijkplayer 和 ffmpeg 在 Android 上的独立编译是一个涉及多步配置和编译的过程,需要对 Android NDK、交叉编译以及 ffmpeg 的内部结构有深入的理解。通过这个过程,开发者可以创建出适合自己应用的定制化版本...

Global site tag (gtag.js) - Google Analytics