Reputation: 14408
Have installed android-ndk-r7, and trying to compile .cpp file.
#include <iostream>
using namespace std;
int main ( int argc, char ** argv)
{
cout <<"Hello World.."<<endl;
}
Executed following command: Got into jni folder, and executed
#ndk-build
Got following error:
/home/jelari/Desktop/androidDevelopment/android-ndk-r7/DCF/jni/test1.cpp:1:20: error: iostream: No such file or directory
/home/jelari/Desktop/androidDevelopment/android-ndk-r7/DCF/jni/test1.cpp: In function 'int main(int, char**)':
/home/jelari/Desktop/androidDevelopment/android-ndk-r7/DCF/jni/test1.cpp:8: error: 'cout' was not declared in this scope
/home/jelari/Desktop/androidDevelopment/android-ndk-r7/DCF/jni/test1.cpp:8: error: 'endl' was not declared in this scope
make: *** [/home/jelari/Desktop/androidDevelopment/android-ndk-r7/DCF/obj/local/armeabi/objs/test1/test1.o] Error 1
What am i doing wrong ?
My Android.mk file looks like:
# A simple test for the minimal standard C++ library
#
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := test1
LOCAL_SRC_FILES := test1.cpp
include $(BUILD_EXECUTABLE)
and Application.mk file looks like:
# Build both ARMv5TE and ARMv7-A machine code.
APP_ABI := armeabi armeabi-v7a
Kindly point out the mistake?
Upvotes: 8
Views: 11338
Reputation: 155
I met this problem and just spent days to update my NDK from r10e to r20, there're several variables are changed.
For 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
For 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
and my main.cpp (including my 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;}
Run ndk-build and build an executable file
For more source code and information for this, check my GitHub
Upvotes: 0
Reputation: 546
Another way is that if you don't have application.mk and android.mk file,
add this in your build.gradle
ndk{
moduleName = your_module_name
stl = "c++_static"
}
Upvotes: 3
Reputation: 62063
Just so the answer is readily accessible here on SO, here it is:
By default, the C++ standard library is very minimal.
You need to set APP_STL in your Application.mk file.
I use:
APP_STL := gnustl_static
but you could have used system, stlport_static, stlport_shared, or gnustl_static.
It's documented under $NDK/docs/CPLUSPLUS-SUPPORT.html, and it's a little hidden, because the $NDK/documentation.html index file doesn't list it.
Quoted from http://groups.google.com/group/android-ndk/browse_thread/thread/983c436239d48704?pli=1
Upvotes: 11