繁体   English   中英

Android NDK r9b和编译C ++ 11

[英]Android NDK r9b and compiling C++11

我正在尝试使用NDK r9b编译一些C ++ 11代码,但无论我尝试什么它都不起作用。 没有C ++ 11功能的编译工作正常。

这是我的Application.mk:

NDK_TOOLCHAIN_VERSION := 4.8
APP_STL := gnustl_static

这是我的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)

如果没有运气,我也试过设置以下内容:

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

我确保Eclipse在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

我有一个C文件(jni.c)和几个测试cpp / hpp。 一切都编译好没有任何C ++ 11功能,包括像<thread>或<memory>这样的东西不会引起任何抱怨,但是当实际创建一个std :: thread对象时,我得到“Type”std :: thread'可以不解决“。 这也适用于我尝试使用的其他功能(std :: unique_ptr,std :: shared_ptr,std :: move()等)。

我已经阅读了许多关于让C ++ 11编译的主题,但似乎没有任何工作,我相信我已经错过了一些但却无法弄清楚它是什么。 任何帮助,将不胜感激!

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

编辑2:std :: atomic似乎工作正常。

对不起,以下应该是评论,而不是回答 - 因为我不知道你的代码有什么问题,但是你可以做些什么来弄清楚自己:


这是我最小的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

这是最小的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 !");
}

它在我的Mac上的r9b中构建干净。 要检查一件事:运行ndk-build V=1并确保链接步骤类似于

~/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

并检查命令的输出

~/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

这是我得到的:

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

可能是你需要逆行:

LOCAL_MODULE    := RAGEAndroid

与线:

LOCAL_CPPFLAGS := -std=c++11 -pthread -frtti -fexceptions

要说这些标志需要在当前模块(RageAndroid)上使用,而不是之前的模块。

顺便说一下,在我的项目中,我需要用上面的行表示c ++ 11(c ++ 0x < - > c ++ 11)(否则它在这里不起作用)。

LOCAL_CPPFLAGS  := -std=c++0x

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM