草庐IT

c++ - 适用于 Android 的 uSTL 或 STLPort?

coder 2023-05-02 原文

我正在使用 Android NDK,由于它目前不支持 STL,我想知道是否有任何优秀的人在这方面取得了成功,或者知道哪个更适合 Android 平台:uSTL 或STL端口。

编辑:
看起来另一个选项可能是 CrystaX .NET .

从他们的网站:

...customized distribution of Android NDK r3 which I have rebuilt from official sources. Support of C++ exceptions, RTTI and Standard C++ Library added.

最佳答案

STL的端口正式可在 Android NDK 版本 r5 中使用上。
它可以用作静态库或共享库。 NDK 预构建了以下实现:

  • STLport ,基于 v5.2.0 :
  • 静态 stlport_static : 如果您的项目中只有一个动态库,请使用。
  • 动态stlport_shared : 如果您的项目中有多个动态库,请使用。
  • GNU libstdc++ system (静态库)

  • 推荐的、简单的使用方法在构建时是通过在 Application.mk 中定义 APP_STL 来实现的,如下所示:
    APP_STL := stlport_static
    

    如果您想重建它(这不是必需的),请在 Application.mk 中定义 STLPORT_FORCE_REBUILD :
    STLPORT_FORCE_REBUILD := true
    

    STLport 的单元测试框架也可用。

    STLport 的当前限制 :
  • 不支持 C++ 异常
  • 不支持 RTTI
  • 支持 wchar_t 的“可能的错误”和语言环境

  • 各种链接:

    NDK 包中的文档位于以下位置(可能还有更多):
  • docsCPLUSPLUS-SUPPORT.html
  • 来源/cxx-STL/STLport
  • 来源/cxx-STL/gnu-libstdc++

  • 下载 NDK + 文档 here ;文件错误 here

    以下是 docs/CPLUSPLUS-SUPPORT.html 的摘录(来自 NDK 文档,r5)

    三、选择 C++ 标准库实现:

    默认情况下,最小 C++ 运行时系统的头文件和库
    库 (/system/lib/libstdc++.so) 在构建 C++ 源时使用。

    但是,您可以通过设置变量来选择不同的实现
    APP_STL 到 Application.mk 中的其他内容,例如:

    APP_STL := STLport_static

    选择此 NDK 提供的静态 STLport 实现。
    值 APP_STL 值如下:

    system -> 使用默认的最小 C++ 运行时库。
    STLport_static -> 使用作为静态库构建的 STLport。
    STLport_shared -> 使用作为共享库构建的 STLport。

    警告:重要警告
     AT THE MOMENT, OUR STLPORT IMPLEMENTATION DOES NOT SUPPORT EXCEPTIONS
     AND RTTI. PLEASE BE SURE TO NOT USE -fexceptions OR -frtti IN ALL
     MODULES THAT USE IT.
    

    警告:重要警告结束

    如果您有多个共享库,则首选“STLport_shared”
    使用 C++ STL 的项目,因为它避免了函数的重复
    更重要的是每个变量中的全局变量(例如 std::cout)
    他们,这可能会产生令人惊讶的结果。

    另一方面,您必须在启动时明确加载它
    应用程序,如下例所示:
     static {
         System.loadLibrary("stlport_shared");
         System.loadLibrary("foo");
         System.loadLibrary("bar");
     }
    

    “libfoo.so”和“libbar.so”都依赖于“libSTLport_shared.so”。

    注意共享库的名称如果是“libSTLport_shared.so”来避免
    与某些 Android 系统镜像的命名冲突,其中包括
    系统级 libSTLport.so(恰好不是 ABI-stable 和
    不能从 NDK 生成的机器代码中使用)。

    如果您的共享库中只有一个共享库,则首选“STLport_static”
    项目:只有您实际需要的 STL 函数和变量
    链接到你的机器代码,减少它的代码大小,你不需要
    在启动时加载动态 STLport_shared。

    四。 STLport 特定问题:

    此 NDK 为 STLport 提供预构建的静态和共享库,
    但是您可以通过定义以下内容来强制从源代码重建它
    在构建之前在您的环境或 Application.mk 中:
    STLPORT_FORCE_REBUILD := true
    

    STLport 在 BSD 风格的开源许可下获得许可。看
    sources/cxx-STL/STLport/README 以获取有关该库的更多详细信息。

    五、 future 计划:
  • 使 STLport 与 C++ 异常和 RTTI 兼容
  • 全面的 GNU libstdc++ 支持
  • uSTL 支持?
  • 关于c++ - 适用于 Android 的 uSTL 或 STLPort?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1650963/

    有关c++ - 适用于 Android 的 uSTL 或 STLPort?的更多相关文章

    1. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

      大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

    2. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

      我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

    3. Ruby Sinatra 配置用于生产和开发 - 2

      我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

    4. ruby - inverse_of 是否适用于 has_many? - 2

      当我使用has_one时,它​​工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290

    5. ruby - 使用 `+=` 和 `send` 方法 - 2

      如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

    6. 安卓apk修改(Android反编译apk) - 2

      最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

    7. ruby - 如何计算 Liquid 中的变量 +1 - 2

      我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

    8. ruby - "undefined method"用于 rails 模型 - 2

      我正在使用带有Rails的Devise,我想添加一个方法“getAllComments”,所以我这样写:classUser在我的Controller中:defdashboard@user=current_user@comments=@user.getAllComments();end当我访问我的url时,我得到了undefinedmethod`getAllComments'for#我做错了什么?谢谢 最佳答案 因为getAllComments是一个类方法,而您正试图将其作为实例方法访问。您要么需要访问它:User.getAllCom

    9. Ruby on Rails regexp equals-tilde 与 array include 用于检查选项列表 - 2

      我正在使用Rails3.2.3和Ruby1.9.3p0。我发现我经常需要确定某个字符串是否出现在选项列表中。看来我可以使用Ruby数组.includemethod:或正则表达式equals-tildematchshorthand用竖线分隔选项:就性能而言,一个比另一个好吗?还有更好的方法吗? 最佳答案 总结:Array#include?包含String元素,在接受和拒绝输入时均胜出,对于您的示例只有三个可接受的值。对于要检查的更大的集合,看起来Set#include?和String元素可能会获胜。如何测试我们应该根据经验对此进行测试

    10. arrays - Ruby 数组 += vs 推送 - 2

      我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“

    随机推荐