Friday, December 20, 2013

eclipse ndk resolve problem

eclipse seem not to resolve includes automatically. I just add those path manually. If adding them does not work, you can remove all the .* configures and import the clean project and add native code again. At least it works for me.

jni
/usr/lib/jvm/java-7-openjdk/include/

clang(I use clang, you can replace it with gcc 4.8)
/opt/android-ndk/toolchains/llvm-3.3/prebuilt/linux-x86_64/lib/clang/3.3/include/

libc++(I use libc++, you can replace it with gnustl)
/opt/android-ndk/sources/cxx-stl/llvm-libc++/libcxx/include/

platform specific includes (such as GLES2)
/opt/android-ndk/platforms/android-19/arch-arm/usr/include/

extra includes(such as eigen3 or boost)
/path/to/your/include


Here is my include path config export

includes.xml

<?xml version="1.0" encoding="UTF-8"?>
<cdtprojectproperties>
<section name="org.eclipse.cdt.internal.ui.wizards.settingswizards.IncludePaths">
<language name="c,cpp">
<includepath>/usr/lib/jvm/java-7-openjdk/include/</includepath>
<includepath>/opt/android-ndk/toolchains/llvm-3.3/prebuilt/linux-x86_64/lib/clang/3.3/include/</includepath>
<includepath>/opt/android-ndk/sources/cxx-stl/llvm-libc++/libcxx/include/</includepath>
<includepath>/opt/android-ndk/platforms/android-19/arch-arm/usr/include/</includepath>
<includepath>/home/jesse/local/android_toolchain/include</includepath>

</language>
</section>
<section name="org.eclipse.cdt.internal.ui.wizards.settingswizards.Macros">
<language name="c,cpp">

</language>
</section>
</cdtprojectproperties>

Friday, December 13, 2013

qt 5.2 opengl

It is quite frustrating. I can never get hellogl_el2 running with qt 5.2. openglunderqml works though.

I thought it might have sth to do with my old tegra tablet. I added -mtune=cortex-a9 -march=armv7-a -mhard-float -mfloat-abi=softfp -mfpu=vfpv3-d16 to qt building. I tested within eclipse. These parameters worked. And qt building seemed to take those. However, I still had no luck with hello_es2 demo. Maybe I have to stay on 5.1.1.

Thursday, December 12, 2013

qt 5.2 SIGILL old devices

Qt 5.1 works for me out of box, but 5.2 does not. I always got SIGILL error on my doom. I googled and got only one piece of information. It is kind of neon related. Neon is some optimization features on latest devices. I disabled it with --no-neon and recompiled. Everything works fine again. Cheers!

Wednesday, December 11, 2013

qt 5.1.1, android, and tricks

Update, qt 5.2 works fine with build-tools r19. Tested with prebuilt qt, both on win8.1 and archlinux. Some old demos do not run. Bad news is the qt 5.2 I compiled from source did not work.

I finally got hellogl_es2 demo to run, after 3 days trying. So far it works on my archlinux. I guess I can make it work on win8.1.

Qt is not that ready for android in my option, at least 5.1. I am not sure about the coming 5.2. There are too many tricks. You need to get right versions of jdk, jre, apache-ant, android-sdk, android-ndk, and so on.

I try to list my settings as detailed as possible.

archlinux 64bit rolling updated.
offical package:
extra/jdk7-openjdk 7.u45_2.4.3-1
extra/jre7-openjdk 7.u45_2.4.3-1
extra/apache-ant 1.9.2-3

aur package:
android-armv7a-eabi-system-image-15 4.0.4_r02-2
android-armv7a-eabi-system-image-19 4.4_r01-1
android-ndk r9b-3
android-platform-10 2.3.3_r02-2
android-platform-11 3.0_r02-2
android-platform-15 4.0.4_r03-1
android-platform-16 4.1.2_r04-1
android-sdk r22.3-1
android-sdk-platform-tools r19-1
android-udev 67-1
(archlinux split sdk into small package, you can also install and manage them through the android-sdk interface)

custom package:
android-qt5 5.1.1-1(I compile qt 5.1.1 for android from source)
android-sdk-build-tools-18.0.1 r18.1.1-1(critical part, latest r19 is not supported by QT5.1. You will have build.xml error with r19)

win 8.1
Make jdk, jre, apache-ant, android-sdk, and ndk up to date.
In the android package managing interface, remove build-tools r19, install r18.1.1.
Double check your system environment variables, ANT_HOME and JAVA_HOME.
If ant works, qt for android should work out of box via qt-creator.

Saturday, December 7, 2013

NDK and c++11 and GPL issue

According to "https://vilimpoc.org/blog/2013/10/05/c11-support-on-android-with-g-4-8/", ndk supports c++11 very well with gcc 4.8 and gnustl_static. I also compile my code with clang3.3, it works so far. So I assume clang works as well.

Note that, modern c++11 works only with gnustl. stlport is free, but does not support c++11. At least, my c++11 can not compile without gnustl.

You could set up the environment manually with ndk-build or put them in your Application.mk like this

APP_STL := gnustl_static
APP_ABI := armeabi
NDK_TOOLCHAIN_VERSION := clang
#NDK_TOOLCHAIN_VERSION := 4.8
APP_CPPFLAGS += -std=c++11

There is a little GPL license trick here. gnustl is with GPL. I am to lazy to read the license line by line. So, correct me if I am wrong. To my understanding, you should be fine with static link to gnustl. This means your stuff has not to be GPL via only static linking to gnustl, due to GPLv3 run time exception. However, you would better not use dynamic link to it.

NDK extrenal libs

After googled a lot, I figured out how to include existing prebuilt libs.

You have to add local modules (static or shared), and let your main module to call them in the android.mk.


#Here is the format for static libs. The shared ones work in the similar way.
#I use libpng as an example

include $(CLEAR_VARS)
LOCAL_MODULE := libpng
LOCAL_SRC_FILES := PATH/TO/YOUR/LIB/libpng.a
LOCAL_EXPORT_C_INCLUDES := PATH/TO/YOUR/INCLUDE
include $(PREBUILT_STATIC_LIBRARY)

#call it in your main module

include $(CLEAR_VARS)

LOCAL_C_INCLUDES := $(ANDROID_TOOLCHAIN)/include/
LOCAL_C_INCLUDES += $(ANDROID_SYSROOT)/include/

LOCAL_MODULE := YourModuleName
LOCAL_CFLAGS := -Wall -Wextra
LOCAL_CPPFLAGS += -std=c++11
LOCAL_SRC_FILES := YourModule.cpp

#add your external static modules
LOCAL_STATIC_LIBRARIES := libpng
LOCAL_LDLIBS := -llog -lGLESv2 -lEGL -landroid

include $(BUILD_SHARED_LIBRARY)