Android NDKプロジェクト(最新のNDK r5bを使用)にvectorなどのC++クラスを含めようとすると、次のようなエラーが表示されます...
Compile++ thumb : test-libstl <= test-libstl.cpp /Users/nitrex88/Desktop/Programming/EclipseProjects/STLTest/jni/test-libstl.cpp:3:18: error: vector: No such file or directory
この問題をオンラインで報告した他の人々は、
APP_STL := stlport_static
application.mkファイルに。 APP_STLの他のすべての可能な値を試しただけでなく、これを実行しました。プロジェクトにクリーンアップし、ndk-build cleanを実行し、objフォルダーとlibsフォルダーを削除しましたが、コンパイルしてもベクタークラスが見つかりません。 NDK r5がリリースされて以来、私はこれに数週間取り組んでおり、誰かからアドバイスがあれば本当に感謝しています。ありがとう!
可能です。手順を追って説明します。
$ PROJECT_DIR/jni/Application.mk:
APP_STL := stlport_static
Stlport_sharedを試してみましたが、運はありません。 libstdc ++と同じです。
$ PROJECT_DIR/jni/Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.cpp
LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)
ここで特別なことはありませんが、ファイルが。cppであることを確認してください。
$ PROJECT_DIR/jni/hello-jni.cpp:
#include <string.h>
#include <jni.h>
#include <Android/log.h>
#include <iostream>
#include <vector>
#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
// Comments omitted.
void
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
jobject thiz )
{
std::vector<std::string> vec;
// Go ahead and do some stuff with this vector of strings now.
}
#ifdef __cplusplus
}
#endif
ここで私を噛んだのは#ifdef __cplusplusだけでした。
ディレクトリを監視します。
コンパイルするには、ndk-build clean && ndk-build
を使用します。
Android studioを使用しているにもかかわらず、ndkを使用してコンパイルしているときに「エラー:ベクター:そのようなファイルまたはディレクトリがありません」というメッセージ(または他のstl関連エラー)が表示される場合、これが役立つ場合があります。
プロジェクトで、モジュールのbuild.gradleファイル(プロジェクトのbuild.gradeではなく、モジュール用のもの)を開き、defaultConfigのndk要素内に「stl "stlport_shared"」を追加します。
例えば:
Android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
applicationId "com.domain.app"
minSdkVersion 15
targetSdkVersion 21
versionCode 1
versionName "1.0"
ndk {
moduleName "myModuleName"
stl "stlport_shared"
}
}
}
私はAndroid Studioを使用していますが、2016年1月19日の時点でこれがうまくいきました。 (これは毎年変わるもののようです)
移動:app-> Gradle Scripts-> build.gradle(モジュール:app)
次に、モデル{... Android.ndk {...および行を追加します。stl= "gnustl_shared"
このような:
model {
...
Android.ndk {
moduleName = "gl2jni"
cppFlags.add("-Werror")
ldLibs.addAll(["log", "GLESv2"])
stl = "gnustl_shared" // <-- this is the line that I added
}
...
}
Sebastianが投稿したコードを追加した後、コマンドラインでndk-build
を使用してプロジェクトをコンパイルできます。しかし、私に関しては、Eclipseに構文エラーがあり、コード補完がありませんでした。
プロジェクトをC/C++プロジェクトに変換する必要があることに注意してください。
この問題を修正するには、プロジェクトを右クリックして、Propertiesをクリックします
C/C++ General->Paths and Symbolsを選択し、${Android_NDK}/sources/cxx-stl/stlport/stlport
をに含めますディレクトリを含める
ダイアログが表示されたら、はいをクリックします。
Before
After
#1を更新
GNU C。ディレクトリを追加し、再構築します。 Cソースファイルにエラーはありません。
GNU C++。ディレクトリを追加し、再構築します。 CPPソースファイルにエラーはありません。
セバスチャンも3年前にそこに良い答えを与えていましたが、新しいNDKバージョンで私と同じ問題に直面する場合に備えて、ここで新しい経験を共有したいと思います。
次のようなコンパイルエラーがあります。
fatal error: map: No such file or directory
fatal error: vector: No such file or directory
私の環境はAndroid-ndk-r9dとadt-bundle-linux-x86_64-20140702です。同じjniフォルダーにApplication.mkファイルを追加し、1行(1行のみ)を挿入します。
APP_STL := stlport_static
しかし、残念ながら、それは私の問題を解決しません!解決するには、Android.mkに次の3行を追加する必要があります。
ifndef NDK_ROOT
include external/stlport/libstlport.mk
endif
そして、私は here から「 'stlport_shared'が優先される」という良い共有を見ました。そのため、静的ライブラリの代わりに共有ライブラリとしてstlportを使用する方が良い解決策かもしれません。次の行をAndroid.mkに追加するだけで、Application.mkファイルを追加する必要はありません。
ifndef NDK_ROOT
include external/stlport/libstlport.mk
endif
LOCAL_SHARED_LIBRARIES += libstlport
これが役に立てば幸いです。
Ndk r10c以降を使用している場合は、APP.STL = c ++ _ staticをApplication.mkに追加するだけです
これが私の場合に問題を引き起こしたものです(CMakeLists.txt
):
set (CMAKE_CXX_FLAGS "...some flags...")
以前に定義されたすべてのインクルードディレクトリを非表示にします。この行を削除/リファクタリングした後、すべてが正常に機能します。
Android NDKで、AndroidマシンのAndroid-ndk-r9b>/sources/cxx-stl/gnu-libstdc ++/4.X/includeに移動します。
私は以下のリンクから解決策を見つけました http://osdir.com/ml/Android-ndk/2011-09/msg00336.html