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)



Tuesday, November 5, 2013

assimp--3.0.1270 clang patch

clang has some different style from gcc. assimp works perfectly with gcc but no luck with clang.

I googled a lot and borrow some patches online. This is tested with linux 64bit clang 3.3 and android ndk clang 3.3


Friday, October 25, 2013

opengl matrix, column major

When I implement lootat function with rotation and translation, I found out the opengl matrix is saved in column major, if you were using 1d array. 2d arrays are with the intuitive representations.

Thursday, October 24, 2013

Simple Makefile to compile and link all the cpp files in the folder

DEFINC := /usr/include/
LIBS := /usr/lib/
INC := $(DEFINC)


CXXFLAGS :=
CXXFLAGS = -I$(INC)
CXXFLAGS += -O2 -march=native
CXXFLAGS += -fPIC

LINK :=
LDFLAGS :=
LDFLAGS += -L$(LIBS) $(LINK)


CXX = g++
LD = g++

SRC := $(wildcard ./*.cpp)
OBJ := $(addprefix ./,$(notdir $(SRC:.cpp=.o)))
TARGET := test


all: $(TARGET)

$(TARGET): $(OBJ)
$(CXX) $(LDFLAGS) -o $@ $^

obj/%.o: src/%.cpp
$(CXX) $(CXXFLAGS) -c -o $@ $<

clean :
rm -rf ./*.o $(TARGET)

Thursday, September 12, 2013

PCM audio

PCM uses signed int to represent sound.U can generate a family of sin function samples, rescale them form -signed_int_max ~ signed_int_max, and convert them into a byte array. Android lib will play it.

Sunday, February 10, 2013

opencv python 64bit waitkey

There is a bug for opencv python api under 64 bit. cv2.WaitKey return a value other than a normal int. Maybe it is a long int.  Usually it is 1048576(0x100000) more than what it should be. I have to add numpy.int16(cv.WaitKey(10)) to fix it.

Friday, January 25, 2013

PhysX linux linking

PhysX offers binary static libs for linux. Linking static libs under linux is tricky. Order matters.

I found -lPhysx3 must be the first one.

Tuesday, January 1, 2013

Parse error at "BOOST_JOIN"

When I compiled RGBDemo/nestk, I got Parse error at "BOOST_JOIN" error. It happened when using cmake, qt4, and boost>1.47 while Qt4 moc was trying to moc boost.

Neither qt or boost community will fix this problem. There are 2 kinds of workarounds I find.

#1(I never tested)
Add
#ifndef Q_MOC_RUN
#endif
to exclude boost head files for qt moc.

#2
change cmake file from
QT4_WRAP_CPP(...)
to
QT4_WRAP_CPP(... OPTIONS -DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED)

With #2, rgbdemo compiled.