0

I am not able to build ChaiScript library for android.
Initially I tried to built the ChaiScript for linuxMint using CMake GUI as below mentioned step

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

It is working fine. so then I tried to build it for Android as below mentioned step

Source Path + binary Path -> Configure -> Specify Generator
1. Select specify tool-chain for cross compiling
2. (android.toolchain.cmake)
3. Path environment variable modified to have android-ndk path(added to .profile)
-> Generate -> Make.

Now it gives error as "error: 'to_string' is not a member of 'std'" & "error: 'stoll' is not a member of 'std'"

Initially I did a POC to use this std::to_string and std::stoll in eclipse + Android + NDK and made it to "compile, build & run". But here in the CMake GUI I don't have any idea how to input the below flags

  • APP_STL:=c++_static
  • TARGET_PLATFORM := android-21
  • TARGET_ARCH_ABI := armeabi-v7a

I tried through the 'Add Entry' and 'string' as type. But no luck. Still the error exist. Any solution/suggestion appreciated.

Community
  • 1
  • 1
Jeet
  • 1,006
  • 1
  • 14
  • 25

1 Answers1

0

I myself posting this solution for my question. (As i compiled the code using eclipse + jni instead CMake GUI, it can't be a proper solution to the asked question. But it may help someone.)

The source successfully compiled, build using Eclipse IDE + Android Project + JNI method (Android NDK + Android.mk + Application.mk). By referring some of the stackoverflow QA, the below given Android.mk and Application.mk script created. Inside the script, in the comments, the reason for using the flags were given. These comments will be useful to understand the script.

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)

Application.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

As my version of android ndk not supporting thread_local storage class i need to un-define the macro "CHAISCRIPT_HAS_THREAD_LOCAL" to the file chaiscript_threading.hpp

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

ndk-build output :

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++>

Code Usage :

#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());
}

Screen Shot : enter image description here

Jeet
  • 1,006
  • 1
  • 14
  • 25
  • It's probably worth just `#define CHAISCRIPT_NO_THREADS` instead of `#undef CHAISCRIPT_HAS_THREAD_LOCAL` I'm guessing you don't need the ChaiScript engine itself to be thread safe and this will be a large performance improvement for you. – lefticus Mar 25 '16 at 00:22
  • @lefticus, Let me check it. – Jeet Mar 25 '16 at 04:11