cygwinandroid编译
A. 使用cygwin编译android的库,编译时出现头文件找不到,该怎么解决
首先磨烂qmake-project然后打开生成的hello.pro文件,加上两行QT+=coreguigreaterThan(QT_MAJOR_VERSION,4):QT+=widgets把这两行瞎消漏放前面大体如桥没下:#######################################################################Automaticallygeneratedbyqmake(3.0)?????2608:54:102014######################################################################QT+=coreguigreaterThan(QT_MAJOR_VERSION,4):QT+=widgetsTEMPLATE=appTARGET=hello#InputSOURCES+=main.cpp然后qmakehello.pro再mingw32-make
B. 如何用Android NDK编译FFmpeg
一、安装cygwin、配置ndk和下载ffmpeg源码
这步就不说了,网上很多教程,再次声明本教程只针对ndk R4这个版本。需要说明的是,本人在cygwin安装路径下的.bash_profile文件中指定的NDK路径如下所示。因为本人装了好几个NDK,因此后面的R4只是个标示。
NDK_R4=/cygdrive/d/android-ndk-r4
export NDK_R4
二、编译前准备和编译
1、因为R4这个NDK比较旧,交叉编译的时候需要在一个Android环境中,那简单,创建一个Android空项目,把整个项目拷出来,在项目下建立一个文件夹jni,把ffmpeg0.6.6的源码拷进去。左图,HelloJni就是我新建的一个项目,Android.mk这时候你还没有,先不用管。右图ffmpeg-0.6.6文件夹的内容要跟我一样,直接就是代码。我这里的ffmpeg_cywin这个文件夹是随便建的,放哪里无所谓的。
2、在ffmpeg-0.6.6下建立一个文件config.sh,内容如下所示。需要注意的是,unix下的换行符和windows下是不一样,如果直接拷贝到windows下的记事本,后面执行这个config.sh的时候会出问题,这里我用的是notepad++编辑的,在编辑->档案格式转换->转换为UNIX格式。(注意,后面的所有的Android.mk的编辑都有此要求)。
简单说一下这个config.sh,PREBUILT和PLATFORM根据你安装ndk的位置而不同,config.sh其实是一个脚本,执行这个脚本的时候又调用了另外一个脚本configure,configure主要是根据编译选项(下面enable disable那些),生成相应的编译配置,就是说你想要编译ffmpeg什么模块就自己定制编译选项的内容。基本上这个文件只要修改一下PREBUILT和PLATFORM就行,其他都不用改。
#!/bin/bash
export PREBUILT=D://android-ndk-r4/build/prebuilt/windows/arm-eabi-4.4.0
export PLATFORM=D://android-ndk-r4/build/platforms/android-8/arch-arm
./configure --target-os=linux \
--arch=arm \
--enable-version3 \
--enable-gpl \
--enable-nonfree \
--disable-stripping \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffserver \
--disable-ffprobe \
--disable-encoders \
--disable-muxers \
--disable-devices \
--disable-protocols \
--enable-protocol=file \
--enable-avfilter \
--disable-network \
--disable-mpegaudio-hp \
--disable-avdevice \
--enable-cross-compile \
--cc=$PREBUILT/bin/arm-eabi-gcc \
--cross-prefix=$PREBUILT/bin/arm-eabi- \
--nm=$PREBUILT/bin/arm-eabi-nm \
--extra-cflags="-fPIC -DANDROID" \
--disable-asm \
--enable-neon \
--enable-armv5te \
--extra-ldflags="-Wl,-T,$PREBUILT/arm-eabi/lib/ldscripts/armelf.x -Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -nostdlib $PREBUILT/lib/gcc/arm-eabi/4.4.0/crtbegin.o $PREBUILT/lib/gcc/arm-eabi/4.4.0/crtend.o -lc -lm -ldl"
3、修改configure文件,找到下图的内容,修改成我这样,这个是用来存放执行脚本过程的临时文件的,我这里用的是D://NDK,你可以设置其他地方,但是要先创建好这个文件夹,放哪里无所谓的。
4、然后在cywin中进入ffmpeg0.6.6文件夹,执行chmod -x config.sh,然后执行./config,此过程需要一定的时间。如果这一步出现问题,很有可能是你config.sh中的PREBUILT和PLATFORM的路径设置不对,或者是你拷贝内容到config.sh的时候没有在UNIX格式下。执行完如下图所示。
5、在ffmpeg-0.6.6下会生成一个config.h文件,编辑它,找到#define restrict restrict这一行,把它改成#define restrict
6、在libavutil/libm.h下,把所有static的方法注释掉或者直接删掉。
7、修改libavcodec,libavfilter,libavformat,libavutil,libpostproc和libswscale目录的MakeFile文件,每个文件中,删除语句
include $( SUBDIR ) ../config.mak 和 include $ (SUBDIR) .. / subdir.mak。
libavcodec下的makefile中搜索inverse.o,把它所在的那一行删掉,要不编译的时候会冲突。
8、在ffmpeg-0.6.6文件夹下,创建av.mk文件(UNIX格式),内容如下:
#LOCAL_PATH is one of libavutil, libavcodec, libavformat, or libswscale
#include $(LOCAL_PATH)/../config-$(TARGET_ARCH).mak
include $(LOCAL_PATH)/../config.mak
OBJS :=
OBJS-yes :=
MMX-OBJS-yes :=
include $(LOCAL_PATH)/Makefile
# collect objects
OBJS-$(HAVE_MMX) += $(MMX-OBJS-yes)
OBJS += $(OBJS-yes)
FFNAME := lib$(NAME)
FFLIBS := $(foreach,NAME,$(FFLIBS),lib$(NAME))
FFCFLAGS = -DHAVE_AV_CONFIG_H -Wno-sign-compare -Wno-switch -Wno-pointer-sign
FFCFLAGS += -DTARGET_CONFIG=\"config-$(TARGET_ARCH).h\"
ALL_S_FILES := $(wildcard $(LOCAL_PATH)/$(TARGET_ARCH)/*.S)
ALL_S_FILES := $(addprefix $(TARGET_ARCH)/, $(notdir $(ALL_S_FILES)))
ifneq ($(ALL_S_FILES),)
ALL_S_OBJS := $(patsubst %.S,%.o,$(ALL_S_FILES))
C_OBJS := $(filter-out $(ALL_S_OBJS),$(OBJS))
S_OBJS := $(filter $(ALL_S_OBJS),$(OBJS))
else
C_OBJS := $(OBJS)
S_OBJS :=
endif
C_FILES := $(patsubst %.o,%.c,$(C_OBJS))
S_FILES := $(patsubst %.o,%.S,$(S_OBJS))
FFFILES := $(sort $(S_FILES)) $(sort $(C_FILES))
9、在jni文件夹下,创建Android.mk(UNIX格式),内容如下:
include $(all-subdir-makefiles)
10、在ffmpeg-0.6.6文件夹下,创建Android.mk,内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_STATIC_LIBRARIES := libavformat libavcodec libavutil libpostproc libswscale
LOCAL_MODULE := ffmpeg
include $(BUILD_SHARED_LIBRARY)
include $(call all-makefiles-under,$(LOCAL_PATH))
11、在ffmpeg-0.6.6\libavformat下,创建Android.mk,内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include $(LOCAL_PATH)/../av.mk
LOCAL_SRC_FILES := $(FFFILES)
LOCAL_C_INCLUDES := \
$(LOCAL_PATH) \
$(LOCAL_PATH)/..
LOCAL_CFLAGS += $(FFCFLAGS)
LOCAL_CFLAGS += -include "string.h" -Dipv6mr_interface=ipv6mr_ifindex
LOCAL_LDLIBS := -lz
LOCAL_STATIC_LIBRARIES := $(FFLIBS)
LOCAL_MODULE := $(FFNAME)
include $(BUILD_STATIC_LIBRARY)
12、在ffmpeg-0.6.6\libavcodec下,创建Android.mk,内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include $(LOCAL_PATH)/../av.mk
LOCAL_SRC_FILES := $(FFFILES)
LOCAL_C_INCLUDES := \
$(LOCAL_PATH) \
$(LOCAL_PATH)/..
LOCAL_CFLAGS += $(FFCFLAGS)
LOCAL_LDLIBS := -lz
LOCAL_STATIC_LIBRARIES := $(FFLIBS)
LOCAL_MODULE := $(FFNAME)
include $(BUILD_STATIC_LIBRARY)
13、在ffmpeg-0.6.6\libavfilter、libavutil、libpostproc和libswscale下,创建Android.mk,内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include $(LOCAL_PATH)/../av.mk
LOCAL_SRC_FILES := $(FFFILES)
LOCAL_C_INCLUDES := \
$(LOCAL_PATH) \
$(LOCAL_PATH)/..
LOCAL_CFLAGS += $(FFCFLAGS)
LOCAL_STATIC_LIBRARIES := $(FFLIBS)
LOCAL_MODULE := $(FFNAME)
include $(BUILD_STATIC_LIBRARY)
14、然后在jni目录下,运行$NDK_R4/ndk-build -B,这里的命令需要根据你自己的情况修改,然后就开始编译了。过程需要10来分钟,成功之后,会在libs下生产libffmpeg.so。如果编译出来的libffmpeg.so只有1.5k,得如下修改一下NDK,再重新编译。
把下面红色部分加到NDK的build/core/build-binary.mk里:
LOCAL_STATIC_LIBRARIES := $(call strip-lib-prefix,$(LOCAL_STATIC_LIBRARIES))
LOCAL_STATIC_WHOLE_LIBRARIES := $(call strip-lib-prefix,$(LOCAL_STATIC_WHOLE_LIBRARIES))
...
static_libraries := $(call map,static-library-path,$(LOCAL_STATIC_LIBRARIES))
static_whole_libraries := $(call map,static-library-path,$(LOCAL_STATIC_WHOLE_LIBRARIES))
...
$(call mole-add-static-depends,$(LOCAL_MODULE),$(LOCAL_STATIC_LIBRARIES))
$(call mole-add-static-depends,$(LOCAL_MODULE),$(LOCAL_STATIC_WHOLE_LIBRARIES))
...
$(LOCAL_BUILT_MODULE): $(static_libraries) $(static_whole_libraries) $(shared_libraries)
...
$(LOCAL_BUILT_MODULE): PRIVATE_STATIC_LIBRARIES := $(static_libraries)
$(LOCAL_BUILT_MODULE): PRIVATE_WHOLE_STATIC_LIBRARIES := $(static_whole_libraries)
接着再将最外层ffmpeg/Android.mk里面的LOCAL_STATIC_LIBRARIES改成LOCAL_STATIC_WHOLE_LIBRARIES
C. 如何用Android NDK编译FFmpeg
Android NDK编译FFmpeg可以采用cygwin方法来实现。
具体步骤:
首先是config脚本,编译ffmpeg之前必须得先configure一下,configure是一个shell脚本,根据命令行参数不同来裁剪模块,生成特定的config.h文件。
confiure脚本文件在ffmpeg目录里可以找到。
重新建立以个shell脚本文件config.sh,这个文件只是为了编译方便。
例子:
注意:
编写config脚本时候,其中的路径需要使用windows形式的路径,不能使用/cygwindriver/d/android 这种格式的路径。
D. cygwin下可以编译android源码吗
cygwin下可以编译android源码。
1.Cygwin简介
Cygwin是在Windows下模拟Linux环境的工具集,它主要包含一下两个部分:
1) cywin1.dll : 该文件模拟了真是的LinuxAPI,是一个API模拟层,开发人员可以将在Linux下编写的C/C++ 源代码在Cygwin中进行编译,在编译的过程中,如果C/C++ 调用了Linux中的API,Cygwin就会利用cygwin1.dll 来编译 C/C++源代码,从而可以在windows下生成Linux下的lib...so文件
2) 模拟Linux环境的工具集
另外,msys也是在windows 下模拟linux环境的工具。
E. 使用Cygwin编译android源码报错:unknown OS: CYGWIN_NT-6.3
修改D:\cocos2d\cocos2d-2.1beta3-x-2.1.0\template\android目录下的build_native.sh文件:
添加NDK路径如下:
在检查NDK_ROOT是否存在的代码
if [ -z "${NDK_ROOT+aaa}" ];then
echo "please define NDK_ROOT"
exit 1
fi
修改后在cygwin中进入到
D:\cocos2d\cocos2d-2.1beta3-x-2.1.0\template\android
执行./build_native.sh命令 就可以了
另外注意:在配置cygwin的NDK环境变量时候,变量名最好写成NDK_ROOT
F. Android studio使用NDK编译问题
NDK编译步骤:
1.选择 ndk 自带的例子 hello-jni ,我的位于E:\android-ndk-r5\samples\hello-jni( 根据具体的安装位置而定 ) 。
2.运行 cygwin ,输入命令 cd /cygdrive/e/android-ndk-r5/samples/hello-jni ,进入到 E:\android-ndk-r5\samples\hello-jni 目录。
3.输入 $NDK/ndk-build ,执行成功后,它会自动生成一个 libs 目录,把编译生成的 .so 文件放在里面。 ($NDK是调用我们之前配置好的环境变量, ndk-build 是调用 ndk 的编译程序 )
4.此时去 hello-jni 的 libs 目录下看有没有生成的 .so 文件,如果有,ndk 就运行正常啦。
G. android development 怎么编译
很多开发者可能下载后编译的Android SDK是Linxu下使用的,如何编译Windows下的Android SDK呢? 这里Android123总结如下:
1. 首先必须在Linux下执行完源码下载,就是reop sync后,首先做一次完整编译,执行make,然后编译Linux下的SDK,执行make sdk即可,在这之前的操作,可以参考 Android源码编译相关问题汇总
2. 这时候在生成out目录下的内容考回到Windows下,如果你用虚拟机这一步只需要拖动操作即可,比较简单。
3. 下载Cygwin,Android开发网提示安装时记住选择Unix/binary而不是DOS/text国内的很多文章均写错了,不然无法正确编译,这在Android官方的howto_build_SDK.txt中写的很详细,具体为When installing Cygwin, set Default Text File Type to Unix/binary, not DOS/text. This is really important, otherwise you will get errors when trying to checkout code using git
4. 安装Cygwin需要下载的包有 autoconf, bison, curl, flex, gcc, g++, git, gnupg, make, mingw-zlib, python, zip, unzip,建议安装 diffutils, emacs, openssh, rsync, vim, wget ,不要安装readline。
5. 然后在Windows下将从Linux从预编译生成的zip一般名为android-sdk_eng.[你电脑的名称]_linux-x86.zip文件找出来,这是Linux下的SDK。
6. 按照howto_build_SDK.txt的步骤,其中最后一步为development/build/tools/make_windows_sdk.sh /path/to/macos/or/linux/sdk.zip ~/mysdk、
最后Android123提示大家,make_windows_sdk.sh是你在Linux下development/build/tools/才有的。
H. windows 下开发 android 需要安装 cygwin吗
一、Android NDK环境简介
Android NDK 是运行于Android 平台上的Native Development Kit 的缩写。
Android 应用如派开发者可以通过NDK 调用C 或C++ 本地代码。
更多介绍参见:http://developer.android.com/sdk/ndk/1.5_r1/index.html
二 、搭建Android NDK环境
安装cygwin
要在Windows 平台上进行NDK的开发,需要安装cygwin(一个在windows平台上模拟linux的软件),NDK 编译需要用到Cygwin 中的make 和gcc, 所以先来下载并安装Cygwin 关于cygwin 安装比较复杂,其下载地址:http://www.cygwin.com/
安装步骤:
1.选择安装方式:
1)Install from Internet:直接从Internet上下载并立即安装(安装完成后,下载好的安装文件并不会被删除,而是仍然被保留,以便下次再安装)。
2)Download Without Installing:只是将安装文件下载到本地,但暂时不安装。
3)Install from Local Directory:不下载安装文件,直接从本地某个含有安装文件的目录进行安装。
2、选择第一项,然后点击下一步:
3、选择要安装的目录,注意,最好不要放到有中文和空格的目录里,似乎会造成安装出问题,其它选项不用变,之后点下一步:
4、上一步是选择安装cygwin的目录,这个是选择你下载的安装包所在的目录,默认是你运行setup.exe的目 录,直接点下一步就可以:
5、此时你共有三种连接方式选择:
1) Direct Connection:直接连接。
2) Use IE5 Settings:使用IE的连接参数设置进行连接。
3) Use HTTP/FTP Proxy:使用HTTP或FTP代理服务器进行连接(需要输入服务器地址、端口号)。数橡仿
用户可根据自己的网络连接的实情情况进行选择,一般正常情况下,均选择第一种,也就是直接连接方式。然后再点击“下一步”,
6、 这是选择要下载的站点,在提供的下载站点中选择一个,选择后点下一步
7、 此时会下载加载安装包列表
8、Search是可以输入你要下载的包的名称,能够快速筛选出你要下载的包。那四个单选按钮是选择下边树的样式,默认就行,不用动。View默认是Category,建议改成full显示全部包再查,省的一些包被隐藏掉。左下角那个复选框是是否隐藏过期包,默认打钩,不用管它就行,下边开始下载我们要安装的包吧,为了避免全部下载,这里列出了后面开发NDK用得着的包:autoconf2.1、automake1.10、binutils、gcc-core、gcc- g++、gcc4-core、gcc4-g++、gdb、pcre、pcre-devel、gawk、make共12个包
9、 然后开始选择安装这些包吧,点skip,把它变成数字版本格式,要确保Bin项变成叉号,而Src项是源码,这个 就没必要选了。
10、 下面测试一下cygwin是不是已经安装好了。
运行cygwin,在弹出的命令行窗口输入:cygcheck -c cygwin命令,会打印出当前cygwin的版本和运行状 态,如果status是ok的话,则cygwin运行正常。
然后依次输入gcc –version,g++ --version,薯纤make –version,gdb –version进行测试,如果都打印出版本信息和一些描述信息,非常高兴的告诉你,你的cygwin安装完成了!
安装 Android NDK
可到Android官网下载:http://developer.android.com/sdk/ndk/index.html
注意选择相应的版本下载,下载后将其解压就可以了。
配置cygwin,用UtriaEdit打开cygwin安装目录下的home/<你的用户名>/.bach-profile文件,在后面加上
NDK=/cygdrive/<NDK安装路径>
export NDK
两行,也可以在windows 下添加 环境变量 $NDK=<NDK安装路径>。
注意:这里如果是中文OS 使用记事本或者写字板打开编辑后,重新启动Cygwin 会报错(编码不同)。
(这部有可能不成功 需要用一个dos2unix.exe把bash_profile这个文件转下编码,具体下载地址大家自己找找) 我直接用的 notepad++ 修改的没有问题。
至此,我们就可以用安装好的NDK来编译一个简单的程序吧,我们选择ndk自带的例子hello-jni,我的位于d/android-ndk-r7c/samples/hello-jni (根据你具体的安装位置而定),
运行cygwin,输入命令cd /cygdrive/d/android-ndk-r7c/samples/hello-jni,进入到d/android-ndk-r7c/samples/hello-jni目录。
输入$NDK/ndk-build,执行成功后,它会自动生成一个libs目录,把编译生成的.so文件放在里面。($NDK是调用我们之前配置好的环境变量,ndk-build是调用ndk的编译程序)
如图:
现在我们终于可以用NDK来编译完成 jni 例子了 。 以上的需要命令来编译,下就用Eclipse CDT 插件来完成
安装CDT插件
CDT是一个使Eclipse支持C/C++的插件。这是下载地址:http://www.eclipse.org/cdt/downloads.php
可以通过在Eclipse 中 help > Install New Software 中安装, 现在,进入Help – Install New Software菜单项,增加一项:CDT - http://download.eclipse.org/tools/cdt/releases/helios, 等待更新项目树加载,然后选中Programming Languages分支下的Eclipse C/C++ Development Tools,然后点击Next按钮。按照后续的提示,接受缺省的选项,最后必须接受许可,以便让Eclipse完成更新。完成后,你将会看到要求重启Eclipse的提示,点击Yes按钮,等待Eclipse重启。现在你的Eclipse就支持C/C++了。
也可以下载插件到本地 ,从本地安装插件。(网络有时候比较。。。)
注意,下载对应 Eclipse 版本的插件 附正版本图
配置C/C++的编译器
1、 打开eclipse,导入ndk自带的hello-jni例子,右键单击项目名称,点击Properties,弹出配置界面,之后再点击Builders,弹出项目的编译工具列表,之后点击New,新添加一个编译器,点击后出现添加界面,选择Program,点 击OK
2、出现了添加界面,首先给编译配置起个名字,如:C_Builder
设置Location为<你cygwin安装路径>\bin\bash.exe程序,例如:E:\cygwin\bin\bash.exe,设置Working Directory为<你cygwin安装路径>\bin目录,例如:E:\cygwin\bin
设置Arguments为
--login -c "cd /cygdrive/d/android-ndk-r7c/samples/hello-jni && $NDK/ndk-build"
上面的配置中 d/android-ndk-r7c/samples/hello-jni 是你当前要编译的程序的目录,$NDK是之前配置 的ndk的环境变量,这两个根据你具体的安装目录进行配置,其他的不用变,Arguments这串参数实际是 给bash.exe命令行程序传参数,进入要编译的程序目录,然后运行ndk-build编译程序
3、接着切换到Refresh选项卡,给Refresh resources upon completion打上钩
4、然后切换到Build Options选项卡,勾选上最后三项
5、之后点击Specify Resources按钮,选择资源目录,勾选你的项目目录即可
6、 最后点击Finish,点击OK一路把刚才的配置都保存下来,注意:如果你配置的编译器在其它编译器下边,记得一定要点Up按钮,把它排到第一位,否则C代码的编译晚于Java代码的编译,会造成你的C代码要编译两次才能看到最新的修改
7、 编译配置也配置完成啦,现在来测试一下是否可以自动编译呢,当你点击 ok 完成之后 其实在console 就可以看到 自动编译信息
如图:
打开项目jni目录里的hello-jni.c文件把提示Hello from JNI!改成其他的文字:如:Hello,My name is 。。。。,然后再模拟器中运行你的程序,模拟器中应该就显示了你最新修改的文字! 如果以上的步骤都没错的话。