我正在尝试使用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功能,一切都可以正常编译,并且包括或之类的内容不会引起任何提示,但是当实际创建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()
关于Android NDK r9b和编译C++ 11,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20021527/