Android-ndk编译osgdb_3ds静态库
Android版本的OSG不支持3ds插件(可以查看osg\src\osgPlugins\CmakeLists.txt文件,搜素’android’关键词,可以搜索到’IF(NOT ANDROID) ADD_SUBDIRECTORY(3ds) ENDIF()’,可见,android下3ds被屏蔽了),也就是使用Android-ndk编译OSG的时候,不能编译osgdb_3ds.a插件,那么接下来展示一下手动编译osgdb_3ds.a的过程,假设OSG其他库已经编译完成,库文件位于c:/cygwin/usr/local/include,头文件位于c:/cygwin/usr/local/obj/local。
1、去android官网下载一个ADT Bundle版本的Eclipse,解压之后,有eclipse和sdk两个文件夹和一个SDK Manager.exe,运行它,省去了插件(CDT、AndroidSDK等)配置过程,再下载一个android-NDK,打开eclipse,Window-Preferences,配置一下NDK路径,如下图,这样环境就搭建好了。
2、新建一个android工程,以ndk自带的例子HelloJni为模板(或者你新建一个空工程,自己添加相关文件)
3、去OSG源代码那里将src\osgPlugins里面的3ds文件夹拷贝到workspace\HelloJni\jni文件夹下,在jni文件夹下新建一个Application.mk文件,文件列表如下(可以删除hello-jni.c):
4、修改jni/Android.mk,修改后内容如下:
Android.mk开始:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_LDLIBS := -lGLESv1_CM -ldl
LOCAL_MODULE := osgdb_3ds
LOCAL_SRC_FILES := 3ds/ReaderWriter3DS.cpp 3ds/WriterNodeVisitor.cpp 3ds/WriterCompareTriangle.cpp\
3ds/lib3ds/lib3ds_io.c\
3ds/lib3ds/lib3ds_atmosphere.c\
3ds/lib3ds/lib3ds_background.c\
3ds/lib3ds/lib3ds_camera.c\
3ds/lib3ds/lib3ds_chunk.c\
3ds/lib3ds/lib3ds_chunktable.c\
3ds/lib3ds/lib3ds_file.c\
3ds/lib3ds/lib3ds_light.c\
3ds/lib3ds/lib3ds_material.c\
3ds/lib3ds/lib3ds_math.c\
3ds/lib3ds/lib3ds_matrix.c\
3ds/lib3ds/lib3ds_mesh.c\
3ds/lib3ds/lib3ds_node.c\
3ds/lib3ds/lib3ds_quat.c\
3ds/lib3ds/lib3ds_shadow.c\
3ds/lib3ds/lib3ds_track.c\
3ds/lib3ds/lib3ds_util.c\
3ds/lib3ds/lib3ds_vector.c\
3ds/lib3ds/lib3ds_viewport.c
LOCAL_C_INCLUDES := c:/cygwin/usr/local/include /3ds/lib3ds
include $(BUILD_STATIC_LIBRARY)#静态库
Android.mk结束。
编译过程中,lib3ds_io.c文件中会报错误,uint_8之类的,添加几个括号就行了。
说明一下LOCAL_C_INCLUDES,c:/cygwin/usr/local/include是make install命令将OSG源代码中的头文件和cmake生成的osg/Config、OpenThreads/Config两个文件(OSG源代码经过Cmake之后产生的,查看一下就知道,只有OpenThreads和osg两个文件夹,每个文件夹下只有一个叫Config的文件,这两个文件必不可少,因为好多OSG源码中需要包含它们,例如osg/Export头文件)安装到c:/cygwin/usr/的。至于如何Cmake,去网上搜索下如何编译Android版本的OSG,OSG官网就有。
5、修改Application.mk文件内容如下:
#ANDROID APPLICATION MAKEFILE
APP_BUILD_SCRIPT := $(call my-dir)/Android.mk
#APP_PROJECT_PATH := $(call my-dir)
APP_OPTIM := release#发布版
#APP_OPTIM := debug#调试版
APP_PLATFORM := android-7#这个版本号应该可以改
APP_STL := gnustl_static#使用静态库
APP_CPPFLAGS := -fexceptions -frtti
APP_ABI := armeabi #armeabi-v7a
APP_MODULES := osgdb_3ds
6、使用$ANDROID_NDK/ndk-build命令编译,ANDROID_NDK 环境变量指示ndk的路径,用记事本打开C:\cygwin\home\yourname\.bash_profile文件,yourname是你的电脑名,在末尾加上ANDROID_NDK=/cygdrive/E/Android/android-ndk-r8 export ANDROID_NDK,如图
先进入hellojni工程目录,然后运行$ANDROID_NDK/ndk-build
可以到hellojni/obj/local/armeabi下找到libosgdb_3ds.a文件。如果libosgdb_3ds.a已经存在,可能ndk不会进行再编译,删除obj文件夹再执行$ANDROID_NDK/ndk-build即可。
至此,android下的3ds插件就编译好了,下面看看怎么使用它。
7、使用libosgdb_3ds.a
将libosgdb_3ds.a放到C:\cygwin\usr\local\obj\local\armeabi路径下。
使用OSG例子osgAndroidExampleGLES1模板,用Eclipse加载它。
A、编辑Android.mk文件
在LOCAL_LDFLAGS中添加-losgdb_3ds
B、修改OsgMainApp.hpp
添加USE_OSGPLUGIN(3ds)//3ds,osg使用静态库需要宏定义USE_OSGPLUGIN
C、修改OsgMainApp.cpp
在void OsgMainApp::initOsgWindow(int x,int y,int width,int height)函数中
_root = new osg::Group();
语句之后添加
osg::Node* mdl3ds=osgDB::readNodeFile("sdcard/teapot.3DS");
_root->addChild(mdl3ds);
编译运行即可。