Ndk-buildツールを使用してcppファイルをコンパイルすると問題が発生します(cygwinを使用したWindows 7)#includeでcppファイルをコンパイルしようとするとエラーが表示されます。
jni/native.cpp:5:20: error: iostream: No such file or directory
これが私のcppファイルです。
#include <jni.h>
#include <string.h>
#include <stdio.h>
#include <Android/log.h>
#include <iostream>
#define DEBUG_TAG "NDK_SampleActivity"
#define LOG_TAG "hellojni"
#define LOGI(...) __Android_log_print(Android_LOG_INFO,LOG_TAG,__VA_ARGS__)
#define LOGE(...) __Android_log_print(Android_LOG_ERROR,LOG_TAG,__VA_ARGS__)
#ifdef __cplusplus
extern "C" {
#endif
void Java_com_test_ndk_SampleActivity_helloLog(JNIEnv* env, jobject thisobj, jstring logThis)
{
jboolean isCopy;
const char * szLogThis = env->GetStringUTFChars(logThis, &isCopy);
__Android_log_print(Android_LOG_DEBUG, DEBUG_TAG, "NDK:LC: [%s]", szLogThis);
env->ReleaseStringUTFChars(logThis, szLogThis);
}
#ifdef __cplusplus
}
#endif
そして、ここに私のAndroid.mkファイルがあります:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
APP_STL:=stlport_static
LOCAL_LDLIBS := -llog
LOCAL_MODULE := swingbyte-Android
LOCAL_SRC_FILES := native.cpp
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include-all
include $(BUILD_SHARED_LIBRARY)
IostreamファイルはAndroid ndkフォルダー(NDK_ROOT\sources\cxx-stl\gnu-libstdc ++\include)にありますが、コンパイラにiotreamを探すように指示する方法がわかりません(そのフォルダ内の他の標準ヘッダーファイル)。
1つまたはいくつかの環境変数、またはいくつかのコンパイラフラグが不足しているようです。
「APP_STL:= stlport_static」はApplication.mkファイルに含まれている必要があります。
「Application.mk」ファイルを作成し、「APP_STL:= stlport_static」と書き込みます。
これは私のために働く。
LOCAL_STATIC_LIBRARIES += libstlport
LOCAL_C_INCLUDES += external/stlport/stlport
LOCAL_C_INCLUDES += bionic
追加中
APP_PLATFORM := Android-23
または、あなたが使用するどんなリビジョンでも私のためにそれを解決しました。
Android ndkを最新のものに更新します。Android ndk ver 5
NDKをr10eからr20に更新するのに数日を費やしただけで、いくつかの変数が変更されました。
NDK r10eの場合
Android.mk:
include $(CLEAR_VARS)
LOCAL_MODULE := main
LOCAL_SRC_FILES := ./main.cpp
LOCAL_C_INCLUDES += $(LOCAL_PATH)/
LOCAL_CPP_EXTENSION := .cxx .cpp .cc
LOCAL_CPPFLAGS := -fexceptions -frtti
LOCAL_CPPFLAGS += -std=c++11 -D__cplusplus=201103L
include $(BUILD_EXECUTABLE)
Application.mk:
APP_ABI := all
APP_STL := gnustl_static
NDK_TOOLCHAIN_VERSION := 4.9
APP_OPTIM := debug
NDK r20の場合
Android.mk:
include $(CLEAR_VARS)
LOCAL_MODULE := main
LOCAL_SRC_FILES := ./main.cpp
LOCAL_C_INCLUDES += $(LOCAL_PATH)/
LOCAL_CPP_EXTENSION := .cxx .cpp .cc
LOCAL_CPPFLAGS := -fexceptions -frtti
LOCAL_CPPFLAGS += -std=c++11 -D__cplusplus=201103L -DANDROID_STL=c++_shared
include $(BUILD_EXECUTABLE)
Application.mk:
APP_ABI := all
#In general, you can only use a static variant of the C++ runtime if you have one and only one shared library in your application.
APP_STL := c++_static
NDK_TOOLCHAIN_VERSION := clang
APP_PLATFORM := Android-23
APP_OPTIM := debug
および私のmain.cpp(私のbin_node.hを含む):
int main(int argc,char **argv) {
printf("****************** tree node ******************\n");
amo::BinNode<int> root(0);
amo::BinNode<int>* lchild1 = root.insertLeftChild(1);
amo::BinNode<int>* rchild2 = root.insertRightChild(2);
amo::BinNode<int>* lchild3 = lchild1->insertLeftChild(3);
amo::BinNode<int>* rchild4 = lchild1->insertRightChild(4);
amo::BinNode<int>* lchild5 = rchild2->insertLeftChild(5);
amo::BinNode<int>* rchild6 = rchild2->insertRightChild(6);
amo::BinNode<int>* lchild7 = lchild3->insertLeftChild(7);
amo::BinNode<int>* rchild8 = lchild3->insertRightChild(8);
amo::BinNode<int>* lchild9 = rchild6->insertLeftChild(9);
amo::BinNode<int>* rchild10 = rchild6->insertRightChild(10);
amo::BinNode<int>* lchild11 = rchild8->insertLeftChild(11);
amo::BinNode<int>* rchild12 = rchild8->insertRightChild(12);
printf("going to root.traversePre()\n");
root.traversePre();
printf("going to root.traversePreLoop()\n");
root.traversePreLoop();
printf("going to root.traversePreLoop2()\n");
root.traversePreLoop2();
printf("\n****************** main return ******************\n");
return 0;}
ndk-buildを実行し、実行可能ファイルをビルドします
詳細なソースコードと情報については、 my GitHub を確認してください。