的Andr​​oid NDK R9B和编译C ++ 11 [英] Android NDK r9b and compiling C++11

查看:579
本文介绍了的Andr​​oid NDK R9B和编译C ++ 11的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图编译使用NDK R9B一些C ++ 11 code,但不管我怎么努力也无法正常工作。编译没有C ++ 11功能正常工作。

下面是我的Application.mk:

  NDK_TOOLCHAIN​​_VERSION:= 4.8
APP_STL:= gnustl_static
 

下面是我的Andr​​oid.mk:

  LOCAL_PATH:= $(叫我-DIR)

包括$(CLEAR_VARS)

file_list中:= $(通配符$(LOCAL_PATH)/ * CPP)。

LOCAL_CPPFLAGS:= -std = C ++ 11 -pthread -frtti -fexceptions
LOCAL_MODULE:= RAGEAndroid
LOCAL_SRC_FILES:= jni.c $(file_list中:$(LOCAL_PATH)/%=%)
LOCAL_LDLIBS:= -llog -lm -landroid -lGLESv3

包括$(BUILD_SHARED_LIBRARY)
 

我已经尝试设置下面太没有运气:

  LOCAL_CFLAGS:= -D__GXX_EXPERIMENTAL_CXX0X__
LOCAL_CPPFLAGS:= -std = GNU + 11 -pthread -frtti -fexceptions
 

我已经确保了Eclipse有在C以下路径++常规 - >路径和符号

 (NDK路径)/来源/ CXX-STL / GNU-的libstdc ++ / 4.8 /包括
(NDK路径)/来源/ CXX-STL / GNU-的libstdc ++ / 4.8 /库/ armeabi /包括
 

我有一个C文件(jni.c)和一对夫妇测试CPP / HPP的。一切编译罚款没有任何C ++ 11的功能,其中包括像<螺纹>或LT;内存>不会造成任何的抱怨,但是当实际创建我碰到一个类型的std ::线程无法解析一个std ::线程对象。这也发生在其他功能我想使用(标准::的unique_ptr,的std :: shared_ptr的,性病::移动()等)。

我读过许多议题上获得C ++ 11编译,但似乎没有任何工作,我相信我已经错过了一些东西,但无法弄清楚它是什么。任何帮助将是AP preciated!

编辑:如果我打印__cplusplus它显示201103L,所以它看起来像它使用的是正确的版本

编辑2:性病::原子似乎正常工作

解决方案

对不起,下面应该是一个评论,而不是答案 - 因为我不知道什么是错在你的code,但在这里是你可以做什么来找出自己:


下面是我最小的 Android.mk

  LOCAL_PATH:= $(叫我-DIR)
包括$(CLEAR_VARS)
LOCAL_MODULE:= HELLO-JNI
LOCAL_SRC_FILES:= HelloJni.cpp
LOCAL_LDLIBS:= -llog
包括$(BUILD_SHARED_LIBRARY)
 

Application.mk

  APP_CPPFLAGS:= -std = C + + 11
NDK_TOOLCHAIN​​_VERSION = 4.8
APP_STL = gnustl_static
 

这里是最小的 HelloJni.cpp

 的#include< jni.h>
#包括<螺纹>

无效doSomeWork(无效)
{
    __android_log_print(ANDROID_LOG_DEBUG,HelloJni,你好,从线程...);
    返回;
}

为externC
的jstring
Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv的* ENV,
                                              jobject THIZ)
{
    的std ::线程t(doSomeWork);
    t.join();
    返回ENV-> NewStringUTF(你好来自JNI!);
}
 

它建立干净的 R9B 我的Mac上。有一件事来检查:运行 NDK建造V = 1 ,并确保链接步骤类似于

<$p$p><$c$c>~/android-ndk-r9b/toolchains/arm-linux-androideabi-4.8/$p$pbuilt/darwin-x86_64/bin/arm-linux-androideabi-g++轮候册,-soname,libhello-jni.so -shared --sysroot =〜/ Android的NDK-R9B /平台/ Android为17 /弓臂./obj/local/armeabi/objs-debug/hello-jni/ HelloJni.o〜/ Android的NDK-R9B /来源/ CXX-STL / GNU-的libstdc ++ / 4.8 /库/ armeabi / libgnustl_static.a -lgcc -no-canonical- prefixes轮候册, - 无未定义 - WL,-z,noexecstack -Wl,-z,relro -Wl,-z,现在-L〜/ Android的NDK-R9B /平台/ Android为17 /弓臂/ usr / lib目录-llog -lc -lm - Ø./obj/local/armeabi/libhello-jni.so

和检查命令的输出

<$p$p><$c$c>~/android-ndk-r9b/toolchains/arm-linux-androideabi-4.8/$p$pbuilt/darwin-x86/bin/arm-linux-androideabi-nm -C〜/ Android的NDK-R9B /来源/ CXX-STL / GNU-的libstdc ++ / 4.8 /库/ armeabi / libgnustl_static.a | grep的的std ::线程

下面是我所得到的:

  00000000牛逼的std ::螺纹:: _ M_start_thread(的std :: shared_ptr的&LT;的std ::螺纹:: _ Impl_base&GT;)
00000000牛逼的std ::螺纹:: hardware_concurrency()
00000000牛逼的std ::螺纹::连接()
00000000牛逼的std ::螺纹::分离()
 

I'm trying to compile some C++11 code using NDK r9b, however no matter what I try it doesn't work. Compiling without C++11 features works fine.

Here is my Application.mk:

NDK_TOOLCHAIN_VERSION := 4.8
APP_STL := gnustl_static

Here is my Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

FILE_LIST := $(wildcard $(LOCAL_PATH)/*.cpp)

LOCAL_CPPFLAGS := -std=c++11 -pthread -frtti -fexceptions
LOCAL_MODULE    := RAGEAndroid
LOCAL_SRC_FILES := jni.c $(FILE_LIST:$(LOCAL_PATH)/%=%)
LOCAL_LDLIBS    := -llog -lm -landroid -lGLESv3

include $(BUILD_SHARED_LIBRARY)

I have tried setting the following too without luck:

LOCAL_CFLAGS := -D__GXX_EXPERIMENTAL_CXX0X__
LOCAL_CPPFLAGS := -std=gnu++11 -pthread -frtti -fexceptions

I have ensured that Eclipse has the following paths in C++ general->Paths and Symbols

(ndk path)/sources/cxx-stl/gnu-libstdc++/4.8/include
(ndk path)/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi/include

I have one C file (jni.c) and a couple of test cpp/hpp. Everything compiles fine without any C++11 features, and including something like <thread> or <memory> doesn't cause any complaints, however when actually creating a std::thread object I get "Type 'std::thread' could not be resolved". This also happens with other features I am trying to use (std::unique_ptr, std::shared_ptr, std::move() e.t.c).

I've read many topics on getting C++11 to compile but nothing seems to work, I believe I've missed something but can't figure out what it is. Any help would be appreciated!

EDIT: If I print __cplusplus it shows 201103L, so it looks like it's using the correct version.

EDIT 2: std::atomic seems to work fine.

解决方案

I'm sorry, the following should have been a comment, not answer - because I don't know what's wrong in your code, but here is what you can do to figure out yourself:


Here's my minimal Android.mk:

LOCAL_PATH      := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := hello-jni
LOCAL_SRC_FILES := HelloJni.cpp
LOCAL_LDLIBS    := -llog
include $(BUILD_SHARED_LIBRARY)

Application.mk

APP_CPPFLAGS := -std=c++11
NDK_TOOLCHAIN_VERSION=4.8
APP_STL=gnustl_static

And here is the minimal HelloJni.cpp

#include <jni.h>
#include <thread>

void doSomeWork( void )
{
    __android_log_print(ANDROID_LOG_DEBUG, "HelloJni", "hello from thread...");
    return;
}

extern "C" 
jstring 
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                              jobject thiz )
{
    std::thread t( doSomeWork );
    t.join();
    return env->NewStringUTF("Hello from JNI !");
}

It builds clean in r9b on my Mac. One thing to check: run ndk-build V=1 and make sure that the link step is similar to

~/android-ndk-r9b/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-g++ -Wl,-soname,libhello-jni.so -shared --sysroot=~/android-ndk-r9b/platforms/android-17/arch-arm ./obj/local/armeabi/objs-debug/hello-jni/HelloJni.o ~/android-ndk-r9b/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi/libgnustl_static.a -lgcc -no-canonical-prefixes  -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now  -L~/android-ndk-r9b/platforms/android-17/arch-arm/usr/lib -llog -lc -lm -o ./obj/local/armeabi/libhello-jni.so

and check output of command

~/android-ndk-r9b/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86/bin/arm-linux-androideabi-nm -C ~/android-ndk-r9b/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi/libgnustl_static.a  | grep std::thread

Here is what I get:

00000000 T std::thread::_M_start_thread(std::shared_ptr<std::thread::_Impl_base>)
00000000 T std::thread::hardware_concurrency()
00000000 T std::thread::join()
00000000 T std::thread::detach()

这篇关于的Andr​​oid NDK R9B和编译C ++ 11的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆