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,解压之后,有eclipsesdk两个文件夹和一个SDK Manager.exe,运行它,省去了插件(CDTAndroidSDK等)配置过程,再下载一个android-NDK,打开eclipseWindow-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/ConfigOpenThreads/Config两个文件(OSG源代码经过Cmake之后产生的,查看一下就知道,只有OpenThreadsosg两个文件夹,每个文件夹下只有一个叫Config的文件,这两个文件必不可少,因为好多OSG源码中需要包含它们,例如osg/Export头文件)安装到c:/cygwin/usr/的。至于如何Cmake,去网上搜索下如何编译Android版本的OSGOSG官网就有。

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);

编译运行即可。

 

posted @ 2013-05-23 10:15  酷熊  阅读(633)  评论(0编辑  收藏  举报