0

Android 用の ChaiScript ライブラリをビルドできません。
最初に、以下の手順で CMake GUI を使用して linuxMint 用の ChaiScript を構築しようとしました。

Source Path + binary Path -> Configure -> Specify Generator -> Generate -> Make.       

正常に動作しています。それで、以下の手順でAndroid用にビルドしようとしました

ソース パス + バイナリ パス -> 構成 -> ジェネレーターを指定
1. クロス コンパイル用のツール チェーンを指定を選択
2. (android.toolchain.cmake)
3. android-ndk パスを持つように変更されたパス環境変数 (.profile に追加)
- > 生成 -> 作成。

現在、「エラー: 'to_string' は 'std' のメンバーではありません」&「エラー: 'stoll' は 'std' のメンバーではありません」というエラーが発生します。

最初に、この std::to_string と std::stoll を eclipse + Android + NDK で使用するために POC を実行し、「コンパイル、ビルド、実行」するようにしました。しかし、ここCMake GUIでは、以下のフラグを入力する方法がわかりません

  • APP_STL:=c++_static
  • TARGET_PLATFORM := アンドロイド-21
  • TARGET_ARCH_ABI := armeabi-v7a

タイプとして「エントリの追加」と「文字列」を試しました。しかし、運がありません。それでもエラーが存在します。解決策/提案をいただければ幸いです。

4

1 に答える 1

0

私自身、質問に対してこのソリューションを投稿しています。(CMake GUIの代わりにeclipse + jniを使用してコードをコンパイルしたため、尋ねられた質問に対する適切な解決策にはなりません。しかし、それは誰かを助けるかもしれません。)

ソースは正常にコンパイルされ、Eclipse IDE + Android Project + JNI メソッド (Android NDK + Android.mk + Application.mk) を使用してビルドされました。stackoverflow QA の一部を参考に、以下の Android.mk と Application.mk スクリプトを作成しました。スクリプト内のコメントに、フラグを使用する理由が示されています。これらのコメントは、スクリプトを理解するのに役立ちます。

Android.mk

LOCAL_PATH := $(call my-dir)
#Build Script to build ChaiScript library
include $(CLEAR_VARS)
#Used the below flag for (error: undefined reference to '__atomic_fetch_add_4')
LOCAL_LDLIBS += -latomic
# Here we give our module name and source file(s)
LOCAL_MODULE    := chaiscript
#ChaiScript header files
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include_CS
#ChaiScript source files
LOCAL_SRC_FILES := src_CS/chaiscript_stdlib.cpp src_CS/main.cpp src_CS/stl_extra.cpp src_CS/test_module.cpp
#CPP files in the extension
LOCAL_CPP_EXTENSION := .cxx .cpp .cc .hpp
include $(BUILD_SHARED_LIBRARY)

#Build Script to build library caller code    
#LOCAL_PATH := $(call my-dir) #won't get cleared by clear_vars
include $(CLEAR_VARS) #clearing the variables defined for chaiscript build
LOCAL_MODULE := test_chaiscript
LOCAL_SRC_FILES := libchaiscript.so #can be 'chaiscript' alone
#ChaiScript Library headerfiles
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include_CS
#Caller code header files
LOCAL_C_INCLUDES := $(LOCAL_PATH)/header_own
#Caller code source files
LOCAL_SRC_FILES := src_own/NativeFunction.cpp src_own/clsArithmeticParser.cpp
include $(BUILD_SHARED_LIBRARY)

アプリケーション.mk

#APP_STL := stlport_static
#Build the library by enabling C++11  
APP_STL:=c++_static
APP_LDLIBS    += -llog
#Used the below flag for 
#(Error: '...' handler must be the last handler for its try block [-fpermissive]
#           } catch (const std::out_of_range &) {)
APP_CPPFLAGS += -fexceptions
#Used the below flag for (Error: 'dynamic_cast' not permitted with -fno-rtti)
APP_CPPFLAGS += -frtti
#Architecture to support armeabi-v7a & x86
APP_ABI := armeabi-v7a x86
#Android platform
APP_PLATFORM := android-21

私のバージョンの Android ndk はthread_local ストレージ クラスをサポートしていないため、マクロ「CHAISCRIPT_HAS_THREAD_LOCAL」をファイル chaiscript_threading.hpp に定義解除する必要があります。

#undef CHAISCRIPT_HAS_THREAD_LOCAL (you can understand if you refer the source code)

ndk-build 出力:

ndk-build 
Android NDK: WARNING: APP_PLATFORM android-21 is larger than android:minSdkVersion 9 in ./AndroidManifest.xml    
[armeabi-v7a] Compile++ thumb: chaiscript <= chaiscript_stdlib.cpp
[armeabi-v7a] Compile++ thumb: chaiscript <= main.cpp
[armeabi-v7a] Compile++ thumb: chaiscript <= stl_extra.cpp
[armeabi-v7a] Compile++ thumb: chaiscript <= test_module.cpp
[armeabi-v7a] SharedLibrary  : libchaiscript.so
[armeabi-v7a] Install        : libchaiscript.so => libs/armeabi-v7a/libchaiscript.so
<i ignored the output of [x86] Compile++>

コードの使用法:

#include "header_own/NativeFunction.h"
#include "include_CS/chaiscript/chaiscript.hpp"
#include "include_CS/chaiscript/chaiscript_stdlib.hpp"

std::string str;

std::string helloWorld(const std::string &t_name) {
    str = "Hello " + t_name + "!";
    return "Hello " + t_name + "!";
}

JNIEXPORT jstring JNICALL Java_com_example_androidxmldesign_1exercise01_clsNativeFunctionWrapper_invokeNativeFunction(
        JNIEnv *env, jobject obj) {
    chaiscript::ChaiScript chai(chaiscript::Std_Lib::library());
    chai.add(chaiscript::fun(&helloWorld), "helloWorld");
    chai.eval(R"(puts(helloWorld("Bob"));)");
    //below string return value will be appended to a textview
    //existing vlaue
    return env->NewStringUTF(str.c_str());
}

スクリーンショット: ここに画像の説明を入力

于 2016-03-24T18:18:01.080 に答える