`

cocos2d-x for Android安装和学习笔记(请用adt-bundle21.1或以上导入)

 
阅读更多

(20121108)注意:这篇文章用cdt编译ndk工程的内容已过时(现在可以用adt-bundle,避免配置繁琐的参数),最新版ADT 20.0.3支持右键把Android工程直接添加native特性(即Android工程和CDT Makefile工程合二为一),不需要做太多复杂的设置,而且完全兼容ndk-build命令行编译。当然,因为会执行完全编译,所以如果经常clean,又想加快编译速度,得另想方法。

 

(20130212)adt-bundle的导入方法文章最后

(20130314) adt-bundle 21.1貌似已修正.svn目录导致编译失败的bug

 

(TODO:内容未稳定)

 

一、安装笔记

1. 下载:

下载官方的源码包

http://code.google.com/p/cocos2d-x/downloads/list

 

2. 创建示例工程:

因为官方没有发布编译后的二进制文件,所以要自己编译。

下载的cocos2d-1.0.1-x-0.13.0-beta.zip压缩包里根目录有一个文件叫create-android-project.bat。(还有个.sh后缀的文件,它不能用cygwin运行)

(20150820补注:在cocos2dx 2.2.6里,创建工程的脚本被移动到tools目录中,名字叫android-buildsetup.sh

20151016补注:应该是tools/project-creator/create_project.py,官方似乎使用这个python脚本,需要python2.7

如果直接运行的话可能会报错,说某个目录错误,需要用编辑器(我用的是notepad2)编辑,修改这几个变量:

_CYGBIN:cygwin的bin目录

_ANDROIDTOOLS:android sdk的tools目录

_NDKROOT:ndk的根目录

然后运行,根据提示输入包名、工程名和API级别。

最后会生成一个以工程名命名的目录,

 

3. 编译.so文件

生成的工程目录有三个子目录:

* android:特定于Android平台的工程文件

* Classes:跨平台的C++源文件和头文件

* Resources:公共的资源文件(跨平台)

在cygwin下cd进去(切换到android子目录中),然后执行

./build_native.sh

编译JNI代码。

编完后libs\armeabi下会出现一个1MB左右的libgame.so文件

obj下会生成一堆中间.o文件,应该是没用的。

 

4. 编译apk和安装到手机

 

 

我事先用bat配置好ant的环境变量:

 

 

@set PATH="C:\WINDOWS"
@set PATH="C:\WINDOWS\system32";%PATH%
@set PATH="D:\java\apache-ant-1.8.1\bin";%PATH%

@set JAVA_HOME="D:\java\jdk1.6.0_20"
@set PATH="D:\java\jdk1.6.0_20\bin";%PATH%

@set PATH="D:\java\android-sdk_r10-windows\android-sdk-windows\platform-tools";%PATH%
@set PATH="D:\java\android-sdk_r10-windows\android-sdk-windows\tools";%PATH%
@cd /D "D:\java\android-sdk_r10-windows\android-sdk-windows\work"
@cmd

 

现在开始用ant编译Android工程(先切换到build.xml的目录中)

> ant debug

(也可以执行ant release,可输入ant查看命令行用法)

生成bin\cocostest-debug.apk

然后用91或adb装到手机上即可。

默认界面上只有一张图片,一个Hello World字符串,一个fps值和一个退出按钮。

 

 

整个过程不需要导入到Eclipse中

 

 

 

 

 

 

二、参考

1. 如何在macox下面配置集成ios和android游戏教程

http://www.cnblogs.com/andyque/archive/2012/02/23/2364163.html

 

2. cocos2d-x初探学习笔记(1)--HelloWorld

http://blog.csdn.net/bill_man/article/details/7202458

 

3. Cocos2D-X官网中文页面

http://cn.cocos2d-x.org/

 

 

 

 

 

 

-------------------------------

(2012/04/23更新)

 

三、独立工具链的编译(不编译依赖库)

(以下对于cocos2d-1.0.1-x-0.13.0-beta)

在(一)中最后会得到几个.a文件。如果不考虑那些库文件的编译,整个.so的编译过程是很简单的。

在ndk-build后面添加V=1的方法打开Makefile的执行输出,可以看到生成.so的关键命令是:

 

 

 写道
arm-linux-androideabi-g++ -Wl,-soname,libgame.so -shared --sysroot=C:/cygwin/home/Administrator/android-ndk-r7b-windows/android-ndk-r7b/platforms/android-8/arch-arm ./obj/local/armeabi/objs/game_shared/helloworld/main.o ./obj/local/armeabi/objs/game_shared/__/__/Classes/AppDelegate.o ./obj/local/armeabi/objs/game_shared/__/__/Classes/HelloWorldScene.o ./obj/local/armeabi/objs/game_shared/__/__/__/lua/cocos2dx_support/CCLuaEngine.o ./obj/local/armeabi/objs/game_shared/__/__/__/lua/cocos2dx_support/Cocos2dxLuaLoader.o ./obj/local/armeabi/objs/game_shared/__/__/__/lua/cocos2dx_support/LuaCocos2d.o ./obj/local/armeabi/objs/game_shared/__/__/__/lua/cocos2dx_support/tolua_fix.o -Wl,--whole-archive ./obj/local/armeabi/libcocos2dx.a ./obj/local/armeabi/libcocosdenshion.a ./obj/local/armeabi/libbox2d.a ./obj/local/armeabi/liblua.a ./obj/local/armeabi/png.a ./obj/local/armeabi/jpeg.a ./obj/local/armeabi/xml2.a -Wl,--no-whole-archive ./obj/local/armeabi/libgnustl_static.a C:/cygwin/home/Administrator/android-ndk-r7b-windows/android-ndk-r7b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.4.3/libgcc.a -Wl,--no-undefined -Wl,-z,noexecstack -LC:/cygwin/home/Administrator/android-ndk-r7b-windows/android-ndk-r7b/platforms/android-8/arch-arm/usr/lib -llog -lz -lGLESv1_CM -llog -lc -lm -o obj/local/armeabi/libgame.so

 

如果不考虑lua/cocos2dx_support下的.o文件,而且假设.a文件已经编译好,那么可以简化为以下Makefile(头文件目录进行了调整,而且因为我对ndk的工具链目录也作了调整,所以不需要添加--sysroot开关)

 

 

CC := arm-linux-androideabi-gcc
CPP := arm-linux-androideabi-g++
LD := arm-linux-androideabi-ld
STRIP := arm-linux-androideabi-strip
RM := rm -rf

CPPFLAGS := -g
CPPFLAGS += -DANDROID -I../Classes -I../cocos2dx -I../cocos2dx/include -I../cocos2dx/platform
LDFLAGS := -shared
LIBS := -Wl,--whole-archive ../cocos2dx/lib/libcocos2dx.a ../cocos2dx/lib/png.a ../cocos2dx/lib/jpeg.a ../cocos2dx/lib/xml2.a -Wl,--no-whole-archive ../cocos2dx/lib/libgnustl_static.a -Wl,--no-undefined -Wl,-z,noexecstack -llog -lz -lGLESv1_CM -llog -lc -lm

TARGET := libs/armeabi/libgame.so

OBJS := jni/helloworld/main.o 
OBJS += ../Classes/AppDelegate.o 
OBJS += ../Classes/HelloWorldScene.o

all : $(TARGET)

$(TARGET) : $(OBJS)
	$(CC) $(LDFLAGS) $(OBJS) $(LIBS) -o $@
	$(STRIP) --strip-unneeded $(TARGET)	

%.o : %.cpp
	$(CPP) $(CPPFLAGS) -o $@ -c $<
	
clean :
	$(RM) $(OBJS) $(TARGET)

 

可以看到,实际上需要编译的源文件只有三个:

 

Android/jni/helloworld/main.cpp 

Classes/AppDelegate.cpp 

Classes/HelloWorldScene.cpp

 

 

 

四、CDT配置

 

 

1. 修改CDT工程属性

假设

(1) 已编译好的所有.a文件:

libcocos2dx.a

png.a

jpeg.a

xml2.a

libgnustl_static.a

已经复制到

G:/weimingtom_tools/android-ndk-r5b/home/Administrator/cocos2d-x/cocos2dx/lib/

目录中。

(2) NDK目录在

C:/cygwin/home/Administrator/android-ndk-r7b-windows/android-ndk-r7b

(3) Android工程的libs\armeabi目录在子目录

android\libs\armeabi

 

(4) cocos2dx源码在

C:\cygwin\home\Administrator\android-ndk-r7b-windows\android-ndk-r7b\cocos2d

 

首先在C/C++ build->Configureation:中选择[All configurations],

然后设置以下内容(列表框支持直接粘贴)

(1) New:

C++ Project->Shared Library->Cross-Compile Project

(2) Prefix:

arm-linux-androideabi-

(3) Path:

C:\cygwin\home\Administrator\android-ndk-r7b-windows\android-ndk-r7b\toolchains\arm-linux-androideabi-4.4.3\prebuilt\windows\bin

(4) Text file encoding:

UTF-8

(5) Make:

C:\cygwin\home\Administrator\android-ndk-r7b-windows\android-ndk-r7b\prebuilt\windows\bin\make

(6) G++ Defined symbols:

ANDROID

(7) G++ Include path:

"C:/cygwin/home/Administrator/android-ndk-r7b-windows/android-ndk-r7b/platforms/android-8/arch-arm/usr/include"

"C:/cygwin/home/Administrator/android-ndk-r7b-windows/android-ndk-r7b/sources/cxx-stl/gnu-libstdc++/include"

"C:/cygwin/home/Administrator/android-ndk-r7b-windows/android-ndk-r7b/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include"

"C:/cygwin/home/Administrator/android-ndk-r7b-windows/android-ndk-r7b/cocos2d/cocos2dx"

"C:/cygwin/home/Administrator/android-ndk-r7b-windows/android-ndk-r7b/cocos2d/cocos2dx/include"

"C:/cygwin/home/Administrator/android-ndk-r7b-windows/android-ndk-r7b/cocos2d/cocos2dx/platform"

${workspace_loc:/${ProjName}/Classes}

(8) G++ Lib:

log

z

GLESv1_CM

c

m

(9) G++ Lib path:

"C:/cygwin/home/Administrator/android-ndk-r7b-windows/android-ndk-r7b/platforms/android-8/arch-arm/usr/lib"

(10) -Wl,-soname=

libgame.so

(11) Artifact name:

game

(12) G++ linker linker flags

--sysroot="C:/cygwin/home/Administrator/android-ndk-r7b-windows/android-ndk-r7b/platforms/android-8/arch-arm"

(13) Expert settings:

Command line pattern:

${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} -Wl,--whole-archive "G:/weimingtom_tools/android-ndk-r5b/home/Administrator/cocos2d-x/cocos2dx/lib/libcocos2dx.a" "G:/weimingtom_tools/android-ndk-r5b/home/Administrator/cocos2d-x/cocos2dx/lib/png.a" "G:/weimingtom_tools/android-ndk-r5b/home/Administrator/cocos2d-x/cocos2dx/lib/jpeg.a" "G:/weimingtom_tools/android-ndk-r5b/home/Administrator/cocos2d-x/cocos2dx/lib/xml2.a" -Wl,--no-whole-archive "G:/weimingtom_tools/android-ndk-r5b/home/Administrator/cocos2d-x/cocos2dx/lib/libgnustl_static.a" -Wl,--no-undefined -Wl,-z,noexecstack ${INPUTS}

(14)Build Steps->Post-build steps->Command:

arm-linux-androideabi-strip --strip-unneeded libgame.so && copy libgame.so ..\android\libs\armeabi

 

2. 如果修改了配置,错误提示仍然没有改变,可尝试:

工程->右键->Index->Rebuild

工程->右键->Refresh

直至错误完全消失

 

3. 编译libgame.so

工程->右键->Build Configurations->Set Active选择Debug还是Release

然后Clean Project, Build Project

 

4. 编译apk

> cd /d C:\Documents and Settings\Administrator\workspace_indigo_sr2\cocostest\android

> ant clean debug install

 
 
我喜欢CDT的原因是它支持方法提示、错误警告跳转和定义跳转,但调试功能没有Qt Creator强。如图所示:
 


 
 
 

 

 


 

 

 


 

 

 ----------------------------------------

 (20130212更新)

在adt-bundle-x86 r21.0.1上导入cocos2dx工程

(基于cocos2d-2.1beta3-x-2.1.1和android-ndk-r7b-windows,

假设已经创建好helloworld工程)

(工程创建方法是修改create-android-project.bat,然后执行它,和cocos2dx的旧版本的创建方法差不多)

 

1. 下载解压adt-bundle

https://developer.android.com/sdk/index.html

然后运行adt-bundle-windows-x86\eclipse\eclipse.exe

2. window->Preferences->Android->NDK填写安装NDK安装根目录,例如:

C:\cygwin\home\Administrator\android-ndk-r7b-windows\android-ndk-r7b

3. 右键->Import...->Android->Existing Android Code Into Workspace

4. 右键->Android Tools->Add Native Support...

5. 右键->Properties->C/C++ Build->Environment

假设cocos2dx安装根目录为C:/cygwin/home/Administrator/cocos2d-2.1beta3-x-2.1.1

添加环境变量NDK_MODULE_PATH为

C:/cygwin/home/Administrator/cocos2d-2.1beta3-x-2.1.1;C:/cygwin/home/Administrator/cocos2d-2.1beta3-x-2.1.1/cocos2dx/platform/third_party/android/prebuilt

(用分号隔开)

修改环境变量PATH为空字符串

6. 主菜单->Project->Clean...

7. 主菜单->Project->Build All...

(如果出现错误,可能需要:项目右键->Index->Rebuild)

8. 检查是否生成libs/armeabi/libgame.so

 

注意事项:

1. 部分Java代码在

cocos2dx安装根目录\cocos2dx\platform\android\java目录下

如果编译器支持Android库工程有问题(例如Windows旧版本的adt),可直接把java源文件复制到工程中。

2. 如果执行Build All时出现

/usr/bin/sh: -c: line 1: syntax error: unexpected end of file

make: *** [libs/armeabi/libgame.so] Error 1

make: *** Deleting file `libs/armeabi/libgame.so'

可能是由于ndk-build编译时环境变量不同造成

请环境变量PATH设置为空字符串(见上面第5步)

3. 如果用命令行,相当于在proj.android目录下执行:

set NDK_MODULE_PATH=C:/cygwin/home/Administrator/cocos2d-2.1beta3-x-2.1.1;C:/cygwin/home/Administrator/cocos2d-2.1beta3-x-2.1.1/cocos2dx/platform/third_party/android/prebuilt

C:\cygwin\home\Administrator\android-ndk-r7b-windows\android-ndk-r7b\ndk-build.cmd 

(可以写一个bat文件放在proj.android目录下执行)

 

 

 (20130313补充)

4. Resources下的图片需复制到proj.android\assets下,否则会弹对话框报错

5. 如果不考虑跨平台,可以把Classes目录移动到proj.android\Classes

然后把Android.mk中的../../Classes改为../Classes

项目右键->Properties->C/C++ General->Path and Symbols->Source Location添加Classes目录

以方便用adt-bundle修改源代码

 

6. 出现错误:Errors running builder 'Android Pre Compiler' on project…无法编译和运行工程

参考:http://stackoverflow.com/questions/14455018/eclipse-android-errors-running-builder-android-pre-compiler-on-project

Open properties of project in Eclipse then Resources -> Resource filters.

Click the "Add..." button -> Check "Exclude all", "Files and folders", "All children". In the text entry box input ".svn" (without quotes).

Restart Eclipse.

原因是旧版本的adt-bundle不支持.svn文件的忽略

解决办法是:

右键属性->Resources -> Resource filters

点击add按钮

勾选"Exclude all", "Files and folders", "All children"

文本框中填入.svn

然后重启Eclipse,重新编译

 (或更新至最新版本的adt-bundle)

 

7. 新版本cocos2dx貌似只支持gles 2.0的设备,所以模拟器似乎不能运行(反正模拟器跑得很慢)。

 

 

 

 

 

 

(20130325)

windows上游戏demo例子(基于旧版本):

https://code.google.com/p/android-app-examples/

 

 

-------------------------------------------------------

(以下内容未实践验证,仅记录备忘)

 

 

(20130402)

1. jni目录中二级目录的Android.mk配置:(参考自https://github.com/eric-h/ObjLoader)

* 顶级目录的Android.mk:

LOCAL_PATH := $(call my-dir)

include $(call all-subdir-makefiles)

* 次级目录的Android.mk:(最后一行的include,对于jni入口用BUILD_SHARED_LIBRARY,对于库用BUILD_STATIC_LIBRARY)

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

...(变量赋值,以下是按顺序排列的设置指定)

include $(BUILD_SHARED_LIBRARY)

#include $(BUILD_STATIC_LIBRARY)

* 修改LOCAL_PATH(不推荐,建议不要使用,放在include $(CLEAR_VARS)前的第一行)

LOCAL_PATH := $(realpath $(call my-dir)/..)

* 非标准的指定静态库(Android.mk所在目录与jni入口的Android.mk不平行。放在所有编译变量的赋值前。不建议,因为include的mk文件的内容不是以LOCAL_PATH := $(call my-dir)开头)

include $(ENGINEDIR)/src/zlib/Android.mk

* 指定输出文件名:

LOCAL_MODULE := libapp

LOCAL_MODULE_FILENAME:= libapp(此项非必须)

* 指定编译用文件(可以是cpp或c文件)和编译参数:

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../(多用于include $(BUILD_SHARED_LIBRARY)所在的Android.mk)

LOCAL_CFLAGS := -Werror -Wall -O4(此项非必须)

LOCAL_SRC_FILES := app.cpp 

* 条件编译参数:

ifeq ($(TARGET_ARCH_ABI),x86)

LOCAL_CFLAGS += -fno-stack-protector 

endif

* 指定静态库:(多用于include $(BUILD_SHARED_LIBRARY)所在的Android.mk)

LOCAL_STATIC_LIBRARIES := libobj libzip libpng

(需要注意次序,被依赖的库放在最后,例如A依赖于B,那么LOCAL_STATIC_LIBRARIES :=  A  B)

* 指定动态库:(一般放在所有变量赋值的最后)

LOCAL_LDLIBS := -lGLESv1_CM -ldl -llog -lz(此项非必须)

 

2. jni目录中Application.mk配置:

* 全局的编译参数:

APP_STL := gnustl_static(多数情况用stlport_static)

APP_CPPFLAGS := -frtti -DCOCOS2D_DEBUG=1

* 打开vfp编译开关-march=armv6 -mcpu=generic-armv6 -mfloat-abi=softfp

(见http://stackoverflow.com/questions/13870691/android-ndk-armv6-vfp-devices-wrong-calculations-nan-denormal-numbers-vfp)

或用github搜索-mfloat-abi=softfp(在Makefile分类中的Application.mk里)

* 交叉编译的目标机器类型和Android版本号(参考自https://code.google.com/p/orange-grass/source/browse/trunk/jni/Application.mk)

APP_PLATFORM := android-10(注意,不同平台所支持的系统jni接口有所不同,由系统的c/c++头文件约束。缺省貌似是读取AndroidMenifest.xml的版本号?这个变量通常是缺省不写的)

APP_ABI := armeabi(多数情况用armeabi,也可以指定all来编译当前ndk支持的所有cpu架构类型,或者指定x86,armeabi和armeabi-v7a其中的若干个)

 

(20130411)

3. 同一个Android.mk编译多个目标(同时编译依赖的静态库和jni动态库)(适用于只有一个依赖库的情况)

(参考自:https://github.com/kenhys/zinnia-android/tree/master/jni)

LOCAL_PATH:= $(call my-dir)

#####

include $(CLEAR_VARS)

LOCAL_MODULE    := libzinnia

LOCAL_SRC_FILES := character.cpp feature.cpp libzinnia.cpp param.cpp recognizer.cpp sexp.cpp svm.cpp trainer.cpp

LOCAL_CFLAGS    := -Werror -DHAVE_CONFIG_H

include $(BUILD_STATIC_LIBRARY)

#####

# JNI

include $(CLEAR_VARS)

LOCAL_MODULE    := libzinniajni

LOCAL_SRC_FILES := libzinniajni.cpp

LOCAL_STATIC_LIBRARIES := libzinnia

include $(BUILD_SHARED_LIBRARY)

 

 

4. 导出变量(用于静态库)

LOCAL_EXPORT_C_INCLUDES

LOCAL_EXPORT_LDLIBS

 

 

(20130530)

5. 获取签名字符串(GetMethodID的第四参数)

cd bin/classes

javap -s -private <类名全称>

例如

private void progress(long size, long timestamp, double duration)

的签名是:

(JJD)V

则在JNI中获取该方法:

jmethodID progress = (*env)->GetMethodID(env, cls, "progress", "(JJD)V");

在JNI中调用(因为返回值为void,所以使用CallVoidMethod):

(*env)->CallVoidMethod(env, obj, progress, size, timestemp, duration);

参数中使用的在JNI中局部创建的对象(JNI局部引用)需要在调用后释放,例如:

(*env)->CallVoidMethod(env, obj, log, result);

(*env)->DeleteLocalRef(env, result);

(*env)->DeleteLocalRef(env, stringClass);

否则可能有堆栈崩溃的危险。

 

 

 

(20131229)

6. 尖括号头文件包含#include<...>的路径搜索问题

 

由于ndk-build把-I头文件搜索路径顺序作了规定,.c文件所在路径优先于sysroot的头文件路径,所以如果与.c文件的目录下出现time.h,而sysroot的include目录也有time.h,那么#include<time.h>将包含当前目录的time.h而非sysroot下的time.h。因此,如果用ndk-build编译ffmpeg(1.2.4,无asm)的时候会出现这种错误:

(项目的Android.mk参考自

https://github.com/clzhan/ffmpeg-ffmpeg-1.2

 

写道
In file included from jni/ffmpeg-1.2/libavutil/parseutils.c:32:0:
jni/ffmpeg-1.2/libavutil/parseutils.h:159:64: warning: 'struct tm' declared inside parameter list [enabled by default]
jni/ffmpeg-1.2/libavutil/parseutils.h:159:64: warning: its scope is only this definition or declaration, which is probably not what you want [enabled by default]
jni/ffmpeg-1.2/libavutil/parseutils.h:172:25: warning: 'struct tm' declared inside parameter list [enabled by default]
jni/ffmpeg-1.2/libavutil/parseutils.c:445:7: error: conflicting types for 'av_small_strptime'
jni/ffmpeg-1.2/libavutil/parseutils.h:159:7: note: previous declaration of 'av_small_strptime' was here
jni/ffmpeg-1.2/libavutil/parseutils.c: In function 'av_small_strptime':
jni/ffmpeg-1.2/libavutil/parseutils.c:467:19: error: dereferencing pointer to incomplete type
jni/ffmpeg-1.2/libavutil/parseutils.c:473:19: error: dereferencing pointer to incomplete type
jni/ffmpeg-1.2/libavutil/parseutils.c:479:19: error: dereferencing pointer to incomplete type
jni/ffmpeg-1.2/libavutil/parseutils.c:485:19: error: dereferencing pointer to incomplete type
jni/ffmpeg-1.2/libavutil/parseutils.c:491:19: error: dereferencing pointer to incomplete type
jni/ffmpeg-1.2/libavutil/parseutils.c:497:19: error: dereferencing pointer to incomplete type
jni/ffmpeg-1.2/libavutil/parseutils.c: At top level:
jni/ffmpeg-1.2/libavutil/parseutils.c:513:8: error: conflicting types for 'av_timegm'
jni/ffmpeg-1.2/libavutil/parseutils.h:172:8: note: previous declaration of 'av_timegm' was here
jni/ffmpeg-1.2/libavutil/parseutils.c: In function 'av_timegm':
jni/ffmpeg-1.2/libavutil/parseutils.c:517:15: error: dereferencing pointer to incomplete type
jni/ffmpeg-1.2/libavutil/parseutils.c:517:39: error: dereferencing pointer to incomplete type
jni/ffmpeg-1.2/libavutil/parseutils.c:517:59: error: dereferencing pointer to incomplete type
jni/ffmpeg-1.2/libavutil/parseutils.c:527:19: error: dereferencing pointer to incomplete type
jni/ffmpeg-1.2/libavutil/parseutils.c:527:38: error: dereferencing pointer to incomplete type
jni/ffmpeg-1.2/libavutil/parseutils.c:527:51: error: dereferencing pointer to incomplete type
jni/ffmpeg-1.2/libavutil/parseutils.c: In function 'av_parse_time':
jni/ffmpeg-1.2/libavutil/parseutils.c:537:12: error: variable 'dt' has initializer but incomplete type
jni/ffmpeg-1.2/libavutil/parseutils.c:537:12: warning: excess elements in struct initializer [enabled by default]
jni/ffmpeg-1.2/libavutil/parseutils.c:537:12: warning: (near initialization for 'dt') [enabled by default]
jni/ffmpeg-1.2/libavutil/parseutils.c:537:15: error: storage size of 'dt' isn't known
jni/ffmpeg-1.2/libavutil/parseutils.c:553:9: warning: implicit declaration of function 'time' [-Wimplicit-function-declaration]
jni/ffmpeg-1.2/libavutil/parseutils.c:630:20: error: variable 'dt2' has initializer but incomplete type
jni/ffmpeg-1.2/libavutil/parseutils.c:630:20: warning: implicit declaration of function 'gmtime' [-Wimplicit-function-declaration]
jni/ffmpeg-1.2/libavutil/parseutils.c:630:38: error: invalid type argument of unary '*' (have 'int')
jni/ffmpeg-1.2/libavutil/parseutils.c:630:20: warning: implicit declaration of function 'localtime' [-Wimplicit-function-declaration]
jni/ffmpeg-1.2/libavutil/parseutils.c:630:54: error: invalid type argument of unary '*' (have 'int')
jni/ffmpeg-1.2/libavutil/parseutils.c:630:23: error: storage size of 'dt2' isn't known
jni/ffmpeg-1.2/libavutil/parseutils.c:630:23: warning: unused variable 'dt2' [-Wunused-variable]
jni/ffmpeg-1.2/libavutil/parseutils.c:636:9: warning: implicit declaration of function 'mktime' [-Wimplicit-function-declaration]
jni/ffmpeg-1.2/libavutil/parseutils.c:537:15: warning: unused variable 'dt' [-Wunused-variable]

 

造成这个错误的原因是libavutil目录下也有一个time.h文件,导致类型为struct tm的变量(如dt)无法找到类型定义。

 

解决办法:(假设SYSROOT_INC的值就是sysroot的头文件路径,依赖于ndk/build的实现)

 

把所有Android.mk中的

 

写道
LOCAL_C_INCLUDES := \
$(LOCAL_PATH) \
$(LOCAL_PATH)/..

 

改为

 

写道
LOCAL_C_INCLUDES :=
LOCAL_C_INCLUDES += $(SYSROOT_INC)/usr/include
#LOCAL_C_INCLUDES += $(LOCAL_PATH)
LOCAL_C_INCLUDES += $(LOCAL_PATH)/..

 

注释掉$(LOCAL_PATH)目录并提前sysroot的优先顺序

 

 

------------------------------------------

(20150802:补充)

如何导入预编译的.so文件

 

jni目录下创建一个子目录prebuilt,在其下面直接复制进.so文件(例如libvinit.so)然后写一个Android.mk文件,内容如下:

 

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := vinit
LOCAL_SRC_FILES := libvinit.so
include $(PREBUILT_SHARED_LIBRARY)

 

参考:

https://github.com/longluo/FFMpeg/blob/master/jni/prebuilt/Android.mk

 

(20150820补充:)

cocos2dx的写法,注意里面使用了$(TARGET_ARCH_ABI),在不同文件夹内放置预编译的静态库(如果是动态库也同理)

写道
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := cocos_jpeg_static
LOCAL_MODULE_FILENAME := jpeg
LOCAL_SRC_FILES := libs/$(TARGET_ARCH_ABI)/libjpeg.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_STATIC_LIBRARY)

 

 

 (20161214)

参考:《怎么在android app中使用STL库》

http://blog.csdn.net/loushuai/article/details/51245644

 

APP_STL 的区别

 1.在jni目录下新建Application.mk; 加入 APP_STL := stlport_static右边的值还可以换成下面几个: 

system - 使用默认最小的C++运行库,这样生成的应用体积小,内存占用小,但部分功能将无法支持 

stlport_static - 使用STLport作为静态库,这项是Android开发网极力推荐的 

stlport_shared - STLport作为动态库,这个可能产生兼容性和部分低版本的Android固件,目前不推荐使用。 

gnustl_static - 使用 GNU libstdc++ 作为静态库。 

默认情况下STLPORT是不支持C++异常处理和RTTI,所以不要出现 -fexceptions 或-frtti;如果真的需要,可以使用gnustl_static来支持标准C++的特性,但生成的文件体积会偏大,运行效率会低一些。 

支持C++异常处理,在Application.mk中加入 LOCAL_CPPFLAGS +=-fexceptions这句,同理支持RTTI,则加入LOCAL_CPPFLAGS +=-frtti,这里再次提醒大家,第二条说的使用gnustl静态库,而不是stlport。 

强制重新编译 STLPort ,在Application.mk中加入STLPORT_FORCE_REBUILD := true可以强制重新编译STLPort源码,由于一些原因可能自己需要修改下STLPort库,一般普通的开发者无需使用此项 

2. 在要使用STL的cpp文件中包含相关的头文件,并且使用using namespace std;

 

 

(20161215)

参考:

http://blog.csdn.net/hxdanya/article/details/39371759

 

NDK编译可执行文件在Android L中运行显示error: only position independent executables (PIE) are supported.失败问题解决办法。

 

 由于使用了NDK编译的可执行文件在应用中调用,在4.4及之前的版本上一直没出问题。最近由于要测试在Android L上的运行情况发现,当运行该可执行文件时,报如下错误:

 

error: only position independent executables (PIE) are supported.

 

PIE这个安全机制从4.1引入,但是Android L之前的系统版本并不会去检验可执行文件是否基于PIE编译出的。因此不会报错。但是Android L已经开启验证,如果调用的可执行文件不是基于PIE方式编译的,则无法运行。解决办法非常简单,在Android.mk中加入如下flag就行。

 

LOCAL_CFLAGS += -pie -fPIE

LOCAL_LDFLAGS += -pie -fPIE

 

 

(TODO:待补充)

 

 

 

 

  • 大小: 113.9 KB
  • 大小: 96 KB
  • 大小: 117 KB
  • 大小: 111.7 KB
分享到:
评论

相关推荐

    Cocos2d-x实战:JS卷——Cocos2d-JS开发

    资源名称:Cocos2d-x实战:JS卷——Cocos2d-JS开发内容简介:本书是介绍Cocos2d-x游戏编程和开发技术书籍,介绍了使用Cocos2d-JS中核心类、瓦片地图、物理引擎、音乐音效、数据持久化、网络通信、性能优化、多平台...

    cocos2d-x-2.1.5

    cocos2d-x-2.1.5

    cocos2d-x事件类

    在使用cocos2d-x开发游戏的过程中,为了实现逻辑和显示相分离。 在下通宵了一个晚上,写出了该事件类。 谨记,该事件只能用于cocos2d-x中。 事件发送者需要继承EventDispatcher类 事件接收者需要继承EventHandle类...

    大富翁手机游戏开发实战基于Cocos2d-x3.2引擎

    资源名称:大富翁手机游戏开发实战基于Cocos2d-x3.2引擎内容简介:李德国编著的《大富翁手机游戏开发实战(基于 Cocos2d-x3.2引擎)》使用Cocos2d-x游戏引擎技术,带领读者一步一步从零开始进行大富翁移动游戏的开发...

    Cocos2d-x高级开发教程

    Cocos2d-x是移动跨平台开发最流行的游戏引擎,而本书是一本很全面的、比较‘接地气’的游戏开发教程。书中汇聚了热门手机游戏《捕鱼达人》开发的实战经验,作者从最基础的内容开始,逐步深入地介绍了Cocos2d-x的相关...

    Cocos2d-x学习笔记

    自己记录的Cocos2d-x学习笔记,希望能够帮助新手,快速入门,掌握cocos2d-x的开发

    cocos2d-x_Android_环境配置手册

    详细介绍cocos2d-x vs2010 android cygwin 环境搭建,楼主亲测,如有疑问,可以私信我!

    cocos2d-x实战项目

    cocos2d-x实战项目 01.cocos2d-x原理及环境配置.rar 03.cocostudio使用方法及UI控制.rar 04.XML文件读取与骨骼动画.rarcocos2d-x实战项目 01.cocos2d-x原理及环境配置.rar 03.cocostudio使用方法及UI控制.rar 04.XML...

    cocos2d-x-3.2旧版引擎下载

    cocos2d-x-3.2下载,不多说。或者可以下载另一个资源 cocos引擎老版本集合(cocos2d-x-2.2.1 - 3.5) http://download.csdn.net/download/crazymagicdc/9982656

    Cocos2D-X游戏开发技术精解

    资源名称:Cocos2D-X游戏开发技术精解内容简介:Cocos2D-X是一款支持多平台的 2D手机游戏引擎,支持iOS、Android、BlackBerry等众多平台。当前,很多移动平台流行的游戏,都是基于Cocos2D-X开发的。 《Cocos2D-X...

    cocos2d-x-3.0 类图

    这是我重新弄的cocos2d-x-3.0的类图.之前别人兄台弄的,有些不全面,有些地方错误.我这个可以说是最新的了.每个类添加了中文的详细注解,同时也添加了中文的类名称翻译.这样对cocos2d-x-3.0的框架比较好上手. 有兴趣的...

    cocos2d-x for xna 2D游戏引擎源码

    xna cocos2d-x是一个用C#编写的2D游戏引擎,基于[cocos2d-x][1]和使用MIT 协议。 引擎由 [cocos2d-x][1] 和 [OpenXLive][2] 联合开发。 cocos2d-x for xna is a 2D game engine in C#, based on [cocos2d-x][1] and ...

    精通COCOS2D-X游戏开发 基础卷_2016.4-P399-13961841.pdf

    精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发

    Cocos2D-X游戏开发技术精解.pdf

    《Cocos2D-X游戏开发技术精解》详细介绍如何使用Cocos2D-X引擎开发自己的移动平台游戏。全书共15章,主要内容包括:Cocos2D-X引擎简介;如何建立跨平台的开发环境;引擎的核心模块——渲染框架;如何实现动态画面和...

    cocos2d-x_v3.16安装及环境变量配置文档

    ocos2d-x v3.16 安装流程文档 ocos2d-x v3.16 环境变量配置文档

    Cocos2d-x 3.x游戏开发实战pdf含目录

    Cocos2d-x 3.x游戏开发实战pdf含目录,内容详细,强烈推荐给大家。

    经典版本 方便下载 源码 旧版本 3.8 官网找不到了 cocos2d-x-3.8.zip

    经典版本 方便下载 源码 旧版本 3.8 官网找不到了 cocos2d-x-3.8.zip

    cocos2d-x 3.0

    cocos2d-x 3.0 人物行走 . 包里有代码和 图片资源.

    cocos2d-x windows vs2010配置

    Cocos2d-x windows vs2010 配置图文详解

    cocos2d-x游戏开发实战精解

    本光盘是《Cocos2d-x游戏开发实战精解》一书的配书光盘,内容介绍如下。 (1)本书教学视频:该文件夹收录了本书的配套多媒体教学视频,可用暴风影音等视频播放器播放。 (2)本书源文件:该文件夹收录了本书涉及...

Global site tag (gtag.js) - Google Analytics