在Android NDK 中使用STLport(译)

Android NDK是Native C/C++开发,不过下载来看了一下缺少常见的STL库,使用起来诸多不便,于是网上google了一把,发现有人做了这样的事情,特别转过来
——————————–
原文: Android NDK – getting STLPort up and running
作者: Pete Cole
——————————-
如果你想在Android NDK使用STLPort, 你必须要做点处理,即便你是在windows上使用cygwin.

首先, 从http://umbel.mooo.com/ 获取一份修改版的 STLPort(by John Ripley (great job, John!)). 如果你是一个 cygwin 用户, 你首先要安装一个git包(译注:可以直接下载snapshot,这样就不要安装git了).

然后将文件拷贝到你的工作目录下. 在我的机器上, 我将文件拷贝到了c:\android-ndk-1.5_r1 目录下, 并将 两个hello-stl 文件夹移动到其他和NDK有关的目录下:

C:\android-ndk-1.5_r1\apps\hello-stl
C:\android-ndk-1.5_r1\sources\samples\hello-stl

然后在Build STLPort前必须修改一些文件…

setup.sh
将最前面的一些行修改正如下样子:

  1. #!/bin/bash
  2. if uname | grep -qi linux; then
  3. export NDK_HOST=linux-x86
  4. elif uname | grep -qi CYGWIN; then
  5. export NDK_HOST=windows
  6. else
  7. export NDK_HOST=darwin-x86
  8. fi

将倒数第三行修改成如下样子:

  1. ln -sf "$NDK_DIR/build/prebuilt/${NDK_HOST}/arm-eabi-4.2.1/bin/arm-eabi-$tool" arm-linux-$tool

stlport/build/lib/android.mak

将TOOLCHAIN_PREFIX这一行修改成

  1. TOOLCHAIN_PREFIX := $(NDK_DIR)/build/prebuilt/$(NDK_HOST)/arm-eabi-4.2.1/bin/arm-eabi-

译注: 我下载来的Wrapper包已经是这个样子了,不用修改

sources/samples/hello-stl/Android.mk
将STLPORT_BASE这一行修改成如下样子:

  1. STLPORT_BASE := /cygdrive/c/android-ndk-1.5_r1/stlport

译注:我没有修改这边,执行了一个export NDK_WRAPPERS_BASE=basepath的操作

将:

  1. LOCAL_LDLIBS += -L$(STLPORT_BASE)/build/lib/obj/gcc/so \
  2. -lstlport

修改成

  1. LOCAL_STATIC_LIBRARIES := libstlport.5.1

Building STLPort
现在文件已经被合并了,你可以立即build STLPort了!

执行如下cygwin shell脚本… 它将build STLPort的静态链接库! 对此你只需要做一次.

  1. export NDK_DIR=/cygdrive/c/android-ndk-1.5-r1
  2. cd $NDK_DIR
  3. ./env.sh
  4. ./setup.sh

现在,像下面这样讲文件拷贝到你的工程中:

  1. cp -p \
  2. /cygdrive/c/android-ndk-1.5_r1\stlport\build\lib\obj\gcc\ar\libstlport.5.1.a \
  3. /cygdrive/c/android-ndk-1.5_r1\out\apps\hello-stl\android-1.5-arm

Building your project’s shared library.
现在你可以返回cygwin的shell窗口,然后执行如下命令:

  1. cd /cygdrive/c/android-ndk-1.5_r1
  2. make APP=hello-stl

将编译你的共享库文件:
C:\android-ndk-1.5_r1\apps\hello-stl\project\libs\armeabi\libhello-stl.so

注: 这会将STLPort静态链接到你的库中.

Building the hello-stl project

在Eclipse中,使用New Project Wizard为每一个例子创建一新的Android project, 使用”Import from Existing Source” 选项从c:\android-ndk-1.5_r1\apps\hello-stl\project 导入源文件

现在你可以编译和运行你的项目了. 将显示从共享库中返回来的std::string字符串 …!

Popularity: 6% [?]

Related

Comments

9 Responses to “在Android NDK 中使用STLport(译)”

  1. seo on December 22nd, 2009 1:36 pm

    多了解下这方面的知识!

    [Reply]

  2. Hendy on March 9th, 2010 9:42 am

    Hi,sunny
    能否给我一份这个ndk-wrapper?http://umbel.mooo.com/已经不提供支持了:(
    现在可能也无法直接使用ndk-wrapper了,但应该会有很大的参考作用。
    如果能给我一份,我将非常感谢:)

    [Reply]

    terry Reply:

    你好,Hendy。我是ndk初学者,目前也需要ndk-wrapper 。如果你能找到的话,希望可以发给我一份。你可以加我的msn,如果我找到什么有价值的资源,也可以方便共享。

    [Reply]

    sunny Reply:

    您好,现在可以使用 http://www.crystax.net/android/ndk.php 这个方案支持stl,比这个要好

    [Reply]

    yuan Reply:

    Hi sunny:

    能不能也给我一份,我和青菜吃虫的情况是一样的,项目里面要求用STLport,项目编译之后是在android平台下面用,谢谢!!

    [Reply]

    admin Reply:

    ps:新版的ndk已经支持stl

    [Reply]

  3. 青菜吃虫 on May 31st, 2010 5:55 pm

    hi, sunny :
    您推荐的crystax方案也很不错, 只是我使用的交叉编译器(MIPS)是别人提供的,此方案行不通。能否提供一份ndk-wrapper的拷贝给我?先谢谢您了。

    [Reply]

  4. 武汉SEO on January 10th, 2011 1:34 pm

    去看看好用不

    [Reply]

  5. 张学连 on November 3rd, 2011 7:28 pm

    Hello.cpp
    #include
    // The code
    // The set of definitions and includes for STLPort
    // They used defined() instead of #ifdef.
    #define _STLP_HAS_INCLUDE_NEXT 1
    #define _STLP_USE_MALLOC 1
    #define _STLP_USE_NO_IOSTREAMS 1
    #include
    #include
    #include

    int main(void)
    {
    std::string a = “abc”;
    printf(“%s”,a.c_str());
    return 0;
    }

    Android.mk
    # A simple test for the minimal standard C++ library
    #
    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_SRC_FILES := test-libstl.cpp
    LOCAL_C_INCLUDES += sources/cxx-stl/stlport/stlport
    LOCAL_SHARED_LIBRARIES += libstlport
    LOCAL_MODULE := test-libstl
    include $(BUILD_EXECUTABLE)

    http://stackoverflow.com/questions/1650963/ustl-or-stlport-for-android

    [Reply]