I'm new with Android so I don't fully understand how to make Android.mk files.
My project was running fine, following a tutorial online where the Android.mk was provided. But later on I needed to add a missing library and the tutorial for that had another Android.mk, now I'm trying to merge the two together.
Here is my Android.mk :
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#opencv
OPENCVROOT:= C:\OpenCV-2.4.10-android-sdk
OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on
OPENCV_LIB_TYPE:=SHARED
include ${OPENCVROOT}/sdk/native/jni/OpenCV.mk
LOCAL_SRC_FILES := com_example_adrien_ndkopencvtest4_OpencvNativeClass.cpp
LOCAL_LDLIBS += -llog
LOCAL_MODULE := MyOpencvLibs
include $(BUILD_SHARED_LIBRARY)
Here is the Android.mk I need to add :
LOCAL_PATH := $(call my-dir)
OPENCV_PATH := D:/CODE/OpenCV-2.4.10-android-sdk/sdk/native/jni
include $(CLEAR_VARS)
LOCAL_MODULE := nonfree
LOCAL_SRC_FILES := libnonfree.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
OPENCV_INSTALL_MODULES := on
OPENCV_CAMERA_MODULES := off
include $(OPENCV_PATH)/OpenCV.mk
LOCAL_C_INCLUDES := \
$(LOCAL_PATH) \
$(OPENCV_PATH)/include
LOCAL_SRC_FILES := \
nonfree_jni.cpp
LOCAL_MODULE := nonfree_demo
LOCAL_CFLAGS := -Werror -O3 -ffast-math
LOCAL_LDLIBS := -llog -ldl
LOCAL_SHARED_LIBRARIES += nonfree
include $(BUILD_SHARED_LIBRARY)
What I'm interested in in the last Android.mk is the libnonfree.so only, I don't need the cpp file.
Here is the structure of my project :
EDIT :
Thanks for your answers. I've done what was suggested and my Android.mk looks like that now :
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#opencv
OPENCVROOT:= C:\OpenCV-2.4.10-android-sdk
OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on
OPENCV_LIB_TYPE:=SHARED
include ${OPENCVROOT}/sdk/native/jni/OpenCV.mk
LOCAL_SRC_FILES := com_example_adrien_ndkopencvtest4_OpencvNativeClass.cpp
LOCAL_LDLIBS += -llog
LOCAL_SHARED_LIBRARIES += nonfree
LOCAL_MODULE := MyOpencvLibs
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := nonfree
LOCAL_SRC_FILES := libnonfree.so
include $(PREBUILT_SHARED_LIBRARY)
But the problem remains. I've got "Undefined reference" to methods libnonfree.so should add. I assumed the problem was from the Android.mk but maybe it's from elsewhere then.
I've added System.loadLibrary("nonfree"); to my MainACtivity and
#include "opencv2/nonfree/nonfree.hpp"
#include "opencv2/nonfree/features2d.hpp"
I don't know what I'm doing wrong.
EDIT 2 :
Here is the error :
Application.mk :
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi-v7a
APP_PLATFORM := android-16
I didn't know where to set arguments="V=1" in my build.gradle
My build.gradle :
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "com.example.adrien.ndkopencvtest4"
minSdkVersion 15
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
sourceSets.main {
//jniLibs.srcDirs = ['src/main/jniLibs']
jni.srcDirs = [] //disable automatic ndk-build call
}
task ndkBuild(type: Exec, description: 'Compile JNI source via NDK') {
commandLine "C:/Users/Adrien/AppData/Local/Android/sdk/ndk-bundle/ndk-build.cmd",
'NDK_PROJECT_PATH=build/intermediates/ndk',
'NDK_LIBS_OUT=src/main/jniLibs',
'APP_BUILD_SCRIPT=src/main/jni/Android.mk',
'NDK_APPLICATION_MK=src/main/jni/Application.mk'
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn ndkBuild
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.github.wseemann:FFmpegMediaMetadataRetriever-armeabi-v7a:1.0.14'
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
compile project(':openCVLibrary2410')
}
EDIT 3 :
Results of "ndk-build V=1" :
C:\Users\Adrien\AndroidStudioProjects\NDKOpencvTest4\app\src\main\jni>ndk-build V=1
[armeabi-v7a] SharedLibrary : libMyOpencvLibs.so
C:/Users/Adrien/AppData/Local/Android/sdk/ndk-bundle/build//../toolchains/llvm/preb
uilt/windows-x86_64/bin/clang++.exe -Wl,-soname,libMyOpencvLibs.so -shared --sysroo
t=C:/Users/Adrien/AppData/Local/Android/sdk/ndk-bundle/build//../platforms/android-
16/arch-arm C:/Users/Adrien/AndroidStudioProjects/NDKOpencvTest4/app/src/main/obj/l
ocal/armeabi-v7a/objs/MyOpencvLibs/com_example_adrien_ndkopencvtest4_OpencvNativeCl
ass.o C:/Users/Adrien/AppData/Local/Android/sdk/ndk-bundle/build//../sources/cxx-st
l/gnu-libstdc++/4.9/libs/armeabi-v7a/libgnustl_static.a -lgcc C:/Users/Adrien/Andro
idStudioProjects/NDKOpencvTest4/app/src/main/obj/local/armeabi-v7a/libopencv_java.s
o C:/Users/Adrien/AndroidStudioProjects/NDKOpencvTest4/app/src/main/obj/local/armea
bi-v7a/libnonfree.so -gcc-toolchain C:/Users/Adrien/AppData/Local/Android/sdk/ndk-
bundle/build//../toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64 -no-c
anonical-prefixes -target armv7-none-linux-androideabi -Wl,--fix-cortex-a8 -Wl,--b
uild-id -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -Wl,--warn-sh
ared-textrel -Wl,--fatal-warnings -LC:/Users/Adrien/AppData/Local/Android/sdk/ndk
-bundle/build//../platforms/android-16/arch-arm/usr/lib -llog -lc -lm -o C:/Users/A
drien/AndroidStudioProjects/NDKOpencvTest4/app/src/main/obj/local/armeabi-v7a/libMy
OpencvLibs.so
C:/Users/Adrien/AndroidStudioProjects/NDKOpencvTest4/app/src/main/jni/com_example_a
drien_ndkopencvtest4_OpencvNativeClass.cpp:214: error: undefined reference to 'cv::
SURF::SURF(double, int, int, bool, bool)'
C:/Users/Adrien/AndroidStudioProjects/NDKOpencvTest4/app/src/main/jni/com_example_a
drien_ndkopencvtest4_OpencvNativeClass.cpp:222: error: undefined reference to 'cv::
SURF::SURF()'
C:/Users/Adrien/AndroidStudioProjects/NDKOpencvTest4/app/src/main/jni/com_example_a
drien_ndkopencvtest4_OpencvNativeClass.cpp:204: error: undefined reference to 'VTT
for cv::SURF'
C:/Users/Adrien/AndroidStudioProjects/NDKOpencvTest4/app/src/main/jni/com_example_a
drien_ndkopencvtest4_OpencvNativeClass.cpp:204: error: undefined reference to 'VTT
for cv::SURF'
C:/Users/Adrien/AndroidStudioProjects/NDKOpencvTest4/app/src/main/jni/com_example_a
C:/Users/Adrien/AndroidStudioProjects/NDKOpencvTest4/app/src/main/jni/com_example_adrien_ndkopencvtest4_OpencvNativeClass.cpp:204: error: undefined
reference to 'VTT for cv::SURF'
C:/Users/Adrien/AndroidStudioProjects/NDKOpencvTest4/app/src/main/jni/com_example_adrien_ndkopencvtest4_OpencvNativeClass.cpp:449: error: undefined
reference to 'cv::SURF::SURF(double, int, int, bool, bool)'
C:/Users/Adrien/AndroidStudioProjects/NDKOpencvTest4/app/src/main/jni/com_example_adrien_ndkopencvtest4_OpencvNativeClass.cpp:457: error: undefined
reference to 'cv::SURF::SURF()'
clang++.exe: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [C:/Users/Adrien/AndroidStudioProjects/NDKOpencvTest4/app/src/main/obj/local/armeabi-v7a/libMyOpencvLibs.so] Error 1
SOLUTION :
My libnonfree.so file was not correct, I downloaded another one. I also changed my Application.mk file to :
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi-v7a
APP_PLATFORM := android-16
If you want to add a prebuilt shared library to your project, you don't need a separate Android.mk
Let's take your script,
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#opencv
OPENCVROOT:= C:\OpenCV-2.4.10-android-sdk
OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on
OPENCV_LIB_TYPE:=SHARED
include ${OPENCVROOT}/sdk/native/jni/OpenCV.mk
LOCAL_SRC_FILES := com_example_adrien_ndkopencvtest4_OpencvNativeClass.cpp
LOCAL_LDLIBS += -llog
LOCAL_MODULE := MyOpencvLibs
include $(BUILD_SHARED_LIBRARY)
and simply add to the bottom the extra module you need:
include $(CLEAR_VARS)
LOCAL_MODULE := nonfree
LOCAL_SRC_FILES := libnonfree.so
include $(PREBUILT_SHARED_LIBRARY)
Now the file C:\Users\Adrien\AndroidStudioProjects\NDKOpencvTest4\app\src\main\jni\libnonfree.so will be packed into your APK.
If you need this library to link your libMyOpencvLibs.so (this means, if your code in com_example_adrien_ndkopencvtest4_OpencvNativeClass.cpp uses some functions exported from libnonfree.so, you should also refeence it in your module:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#opencv
OPENCVROOT:= C:\OpenCV-2.4.10-android-sdk
OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on
OPENCV_LIB_TYPE:=SHARED
include ${OPENCVROOT}/sdk/native/jni/OpenCV.mk
LOCAL_SRC_FILES := com_example_adrien_ndkopencvtest4_OpencvNativeClass.cpp
LOCAL_LDLIBS += -llog
LOCAL_SHARED_LIBRARIES += nonfree
LOCAL_MODULE := MyOpencvLibs
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := nonfree
LOCAL_SRC_FILES := libnonfree.so
include $(PREBUILT_SHARED_LIBRARY)
Modify your android.mk as:
LOCAL_PATH := $(call my-dir)
OPENCV_PATH := D:/CODE/OpenCV-2.4.10-android-sdk/sdk/native/jni
include $(CLEAR_VARS)
LOCAL_MODULE := nonfree
LOCAL_SRC_FILES := libnonfree.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
#opencv
OPENCVROOT:= C:\OpenCV-2.4.10-android-sdk
OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on
OPENCV_LIB_TYPE:=SHARED
include ${OPENCVROOT}/sdk/native/jni/OpenCV.mk
LOCAL_SRC_FILES := com_example_adrien_ndkopencvtest4_OpencvNativeClass.cpp
LOCAL_SHARED_LIBRARIES += nonfree
LOCAL_LDLIBS += -llog
LOCAL_MODULE := MyOpencvLibs
include $(BUILD_SHARED_LIBRARY)
Here the prebuild library i.e. libnonfree.so is declared in the android.mk, and referenced to it later via
LOCAL_SHARED_LIBRARIES += nonfree
Now to use it you need to load the latest built library in yout MainActivity i.e.
System.loadLibrary("MyOpencvLibs");
Thats it, now you have merged both the android.mk files into a new module named: MyOpencvLibs
For better understanding you can read my blog : https://androidtutsweb.wordpress.com/2017/04/04/android-mk-for-ndk-build-using-pre-build-libraries/
Related
I built PCL library for Android with
hcteq.wordpress.com/2014/07/14/compiling-pcl-for-android-in-windows-cmake-gui
I tried to include these library in Android Studio with Project github.com/roomplan/tango-examples-java/tree/master/PointCloudJava_with_PCL
To write .mk and .gradle file, I referred
stackoverflow.com/questions/35491012/issue-running-pcl-library-with-android-project
github.com/kalectro/pcl_groovy/blob/master/mobile_apps/android/OpenNIRecorder/jni/Android.mk
Here is my Android.mk
LOCAL_PATH := $(call my-dir)
PROJECT_ROOT_FROM_JNI := ../../../../..
PROJECT_ROOT := $(LOCAL_PATH)/$(PROJECT_ROOT_FROM_JNI)
PCL_INCLUDE := $(LOCAL_PATH)/../../../../../PCL/pcl-android
BOOST_ANDROID_INCLUDE := $(LOCAL_PATH)/../../../../../PCL/boost-android
FLANN_INCLUDE := $(LOCAL_PATH)/../../../../../PCL/flann-android
EIGEN_INCLUDE := $(LOCAL_PATH)/../../../../../PCL/eigen
NDK_TOOLCHAIN_VERSION=4.9
# PCL libraries
PCL_STATIC_LIB_DIR := $(PCL_INCLUDE)/lib
BOOST_STATIC_LIB_DIR := $(BOOST_ANDROID_INCLUDE)/lib
FLANN_STATIC_LIB_DIR := $(FLANN_INCLUDE)/lib
PCL_STATIC_LIBRARIES := pcl_common pcl_geometry pcl_kdtree pcl_octree pcl_sample_consensus pcl_surface \
pcl_features pcl_keypoints pcl_search pcl_tracking pcl_filters pcl_ml \
pcl_registration pcl_segmentation
BOOST_STATIC_LIBRARIES := boost_date_time boost_iostreams boost_regex boost_system \
boost_filesystem boost_program_options boost_signals boost_thread
FLANN_STATIC_LIBRARIES := flann_s flann_cpp_s
define build_pcl_static
include $(CLEAR_VARS)
LOCAL_MODULE:=$1
LOCAL_SRC_FILES:=$(PCL_STATIC_LIB_DIR)/lib$1.a
include $(PREBUILT_STATIC_LIBRARY)
endef
define build_boost_static
include $(CLEAR_VARS)
LOCAL_MODULE:=$1
LOCAL_SRC_FILES:=$(BOOST_STATIC_LIB_DIR)/lib$1.a
include $(PREBUILT_STATIC_LIBRARY)
endef
define build_flann_static
include $(CLEAR_VARS)
LOCAL_MODULE:=$1
LOCAL_SRC_FILES:=$(FLANN_STATIC_LIB_DIR)/lib$1.a
include $(PREBUILT_STATIC_LIBRARY)
endef
$(foreach module,$(PCL_STATIC_LIBRARIES),$(eval $(call build_pcl_static,$(module))))
$(foreach module,$(BOOST_STATIC_LIBRARIES),$(eval $(call build_boost_static,$(module))))
$(foreach module,$(FLANN_STATIC_LIBRARIES),$(eval $(call build_flann_static,$(module))))
# Project and linking
include $(CLEAR_VARS)
LOCAL_MODULE := helloPcl
LOCAL_CFLAGS := -std=gnu++11
LOCAL_C_INCLUDES := $(PCL_INCLUDE)/include/pcl-1.6 \
$(BOOST_ANDROID_INCLUDE)/include \
$(EIGEN_INCLUDE) \
$(FLANN_INCLUDE)/include
LOCAL_LDFLAGS += -L$(PCL_INCLUDE)/lib \
-L$(BOOST_ANDROID_INCLUDE)/lib \
-L$(FLANN_INCLUDE)/lib
LOCAL_SHARED_LIBRARIES += pcl_common pcl_geometry pcl_search pcl_kdtree pcl_octree pcl_sample_consensus \
pcl_surface pcl_features pcl_filters pcl_keypoints pcl_tracking pcl_ml \
pcl_registration pcl_segmentation
LOCAL_SHARED_LIBRARIES += boost_date_time boost_iostreams boost_regex boost_system \
boost_filesystem boost_program_options boost_signals boost_thread
LOCAL_SHARED_LIBRARIES += flann flann_cpp
LOCAL_SRC_FILES := jni_part.cpp \
pcl_lib.cpp
LOCAL_LDLIBS := -lstdc++ -lc -lm -llog -landroid -ldl -lGLESv2 -lEGL \
-lpcl_common -lpcl_geometry -lpcl_search -lpcl_kdtree -lpcl_octree -lpcl_sample_consensus \
-lpcl_surface -lpcl_features -lpcl_filters -lpcl_keypoints -lpcl_tracking -lpcl_ml \
-lpcl_registration -lpcl_segmentation \
-lflann -lflann_cpp
LOCAL_CFLAGS += -mfloat-abi=softfp -mfpu=neon -march=armv7 -mthumb -O3
include $(BUILD_SHARED_LIBRARY)
Application.mk
APP_ABI := armeabi-v7a
APP_PLATFORM := android-19
#APP_STL := stlport_static
APP_CPPFLAGS := -frtti -fexceptions
APP_STL := gnustl_static
and build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
defaultConfig {
applicationId "com.tangoproject.experiments.javapointcloud"
minSdkVersion 19
targetSdkVersion 23
versionCode 1
versionName "1.0"
ndk {
moduleName 'helloPcl'
}
}
sourceSets.main {
jni.srcDirs = [];
jniLibs.srcDir 'src/main/libs'
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}
task buildNative(type: Exec, description: 'Compile JNI source via NDK') {
def ndkDir = android.ndkDirectory
commandLine "$ndkDir/ndk-build.cmd",
'-C', file('src/main/jni').absolutePath, // Change src/main/jni the relative path to your jni source
'-j', Runtime.runtime.availableProcessors(),
'all',
'NDK_DEBUG=1'
}
task cleanNative(type: Exec, description: 'Clean JNI object files') {
def ndkDir = android.ndkDirectory
commandLine "$ndkDir/ndk-build.cmd",
'-C', file('src/main/jni').absolutePath, // Change src/main/jni the relative path to your jni source
'clean'
}
clean.dependsOn 'cleanNative'
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn buildNative
}
dependencies {
compile project(':tangoUtils')
compile files('libs/tango_java_lib.jar')
}
it seems that I have successfully linked the library for .cpp files, but there are errors show like this link
Does anyone know how to resolve this problem? Thanks.
PS There is similar question on Point Cloud Library (PCL) Users mailing list(www.pcl-users.org/Undefined-reference-to-PCDWrite-and-PCDWriteASCII-td4043323.html), but still no answer.
PS2 Or anyone can provide some instructions for using PCL in Android Studio?
Edit
I modified my Android.mk file here
LOCAL_PATH := $(call my-dir)
PROJECT_ROOT_FROM_JNI := ../../../../..
PROJECT_ROOT := $(LOCAL_PATH)/$(PROJECT_ROOT_FROM_JNI)
PCL_INCLUDE := $(LOCAL_PATH)/../../../../../PCL/pcl-android
BOOST_ANDROID_INCLUDE := $(LOCAL_PATH)/../../../../../PCL/boost-android
FLANN_INCLUDE := $(LOCAL_PATH)/../../../../../PCL/flann-android
EIGEN_INCLUDE := $(LOCAL_PATH)/../../../../../PCL/eigen
NDK_TOOLCHAIN_VERSION=4.9
# PCL libraries
PCL_STATIC_LIB_DIR := $(PCL_INCLUDE)/lib
BOOST_STATIC_LIB_DIR := $(BOOST_ANDROID_INCLUDE)/lib
FLANN_STATIC_LIB_DIR := $(FLANN_INCLUDE)/lib
PCL_STATIC_LIBRARIES := pcl_common pcl_geometry pcl_kdtree pcl_octree pcl_sample_consensus pcl_surface \
pcl_features pcl_keypoints pcl_search pcl_tracking pcl_filters pcl_ml \
pcl_registration pcl_segmentation pcl_io pcl_io_ply pcl_recognition
BOOST_STATIC_LIBRARIES := boost_date_time boost_iostreams boost_regex boost_system \
boost_filesystem boost_program_options boost_signals boost_thread
FLANN_STATIC_LIBRARIES := flann_s flann_cpp_s
define build_pcl_static
include $(CLEAR_VARS)
LOCAL_MODULE:=$1
LOCAL_SRC_FILES:=$(PCL_STATIC_LIB_DIR)/lib$1.a
include $(PREBUILT_STATIC_LIBRARY)
endef
define build_boost_static
include $(CLEAR_VARS)
LOCAL_MODULE:=$1
LOCAL_SRC_FILES:=$(BOOST_STATIC_LIB_DIR)/lib$1.a
include $(PREBUILT_STATIC_LIBRARY)
endef
define build_flann_static
include $(CLEAR_VARS)
LOCAL_MODULE:=$1
LOCAL_SRC_FILES:=$(FLANN_STATIC_LIB_DIR)/lib$1.a
include $(PREBUILT_STATIC_LIBRARY)
endef
$(foreach module,$(PCL_STATIC_LIBRARIES),$(eval $(call build_pcl_static,$(module))))
$(foreach module,$(BOOST_STATIC_LIBRARIES),$(eval $(call build_boost_static,$(module))))
$(foreach module,$(FLANN_STATIC_LIBRARIES),$(eval $(call build_flann_static,$(module))))
# Project and linking
include $(CLEAR_VARS)
LOCAL_MODULE := helloPcl
LOCAL_CFLAGS := -std=gnu++11
LOCAL_SRC_FILES := jni_part.cpp \ pcl_lib.cpp
#pcl library
LOCAL_LDFLAGS += -L$(PCL_INCLUDE)/lib \
-L$(BOOST_ANDROID_INCLUDE)/lib \
-L$(FLANN_INCLUDE)/lib
LOCAL_C_INCLUDES += $(PCL_INCLUDE)/include/pcl-1.6 \
$(BOOST_ANDROID_INCLUDE)/include \
$(EIGEN_INCLUDE) \
$(FLANN_INCLUDE)/include
LOCAL_STATIC_LIBRARIES += pcl_common pcl_geometry pcl_kdtree pcl_octree pcl_sample_consensus \
pcl_surface pcl_features pcl_io pcl_keypoints pcl_recognition \
pcl_search pcl_tracking pcl_filters pcl_io_ply pcl_ml \
pcl_registration pcl_segmentation
LOCAL_STATIC_LIBRARIES += boost_date_time boost_iostreams boost_regex boost_system \
boost_filesystem boost_program_options boost_signals \
boost_thread
LOCAL_SHARED_LIBRARIES := tango_client_api tango_support_api
LOCAL_SHARED_LIBRARIES += flann flann_cpp
LOCAL_CFLAGS += -mfloat-abi=softfp -mfpu=neon -march=armv7 -mthumb -O3
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
include $(BUILD_SHARED_LIBRARY)
$(call import-add-path,$(PROJECT_ROOT))
$(call import-module,tango_client_api)
$(call import-module,tango_support_api)
and now there are different error
D:/Lab/senior/PCL/PointCloudJava_with_PCL_1/pointCloudJava_with_PCL/src/main/jni/../../../../../PCL/pcl-android/lib/libpcl_io.a(pcd_io.cpp.o):pcd_io.cpp:function pcl::PCDWriter::writeBinary(std::string const&, sensor_msgs::PointCloud2 const&, Eigen::Matrix<float, 4, 1, 0, 4, 1> const&, Eigen::Quaternion<float, 0> const&): error: undefined reference to '__page_size'
D:/Lab/senior/PCL/PointCloudJava_with_PCL_1/pointCloudJava_with_PCL/src/main/jni/../../../../../PCL/pcl-android/lib/libpcl_io.a(pcd_io.cpp.o):pcd_io.cpp:function pcl::PCDWriter::writeBinaryCompressedEigen(std::string const&, pcl::PointCloud<Eigen::Matrix<float, -1, -1, 0, -1, -1> > const&): error: undefined reference to '__page_size'
D:/Lab/senior/PCL/PointCloudJava_with_PCL_1/pointCloudJava_with_PCL/src/main/jni/../../../../../PCL/pcl-android/lib/libpcl_io.a(pcd_io.cpp.o):pcd_io.cpp:function pcl::PCDWriter::writeBinaryCompressed(std::string const&, sensor_msgs::PointCloud2 const&, Eigen::Matrix<float, 4, 1, 0, 4, 1> const&, Eigen::Quaternion<float, 0> const&): error: undefined reference to '__page_size'
D:/Lab/senior/PCL/PointCloudJava_with_PCL_1/pointCloudJava_with_PCL/src/main/jni/../../../../../PCL/pcl-android/lib/libpcl_io.a(pcd_io.cpp.o):pcd_io.cpp:function pcl::PCDWriter::writeBinaryEigen(std::string const&, pcl::PointCloud<Eigen::Matrix<float, -1, -1, 0, -1, -1> > const&): error: undefined reference to '__page_size'
clang++.exe: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [D:/Lab/senior/PCL/PointCloudJava_with_PCL_1/pointCloudJava_with_PCL/src/main/obj/local/armeabi-v7a/libhelloPcl.so] Error 1
make: Leaving directory `D:/Lab/senior/PCL/PointCloudJava_with_PCL_1/pointCloudJava_with_PCL/src/main/jni'
:pointCloudJava_with_PCL:buildNative FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':pointCloudJava_with_PCL:buildNative'.
> Process 'command 'C:\Users\CAIG\AppData\Local\Android\Sdk\ndk-bundle/ndk-build.cmd'' finished with non-zero exit value 2
If I add the line below in Android.mk, errors will not occur and can compile success
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
But when run the .apk, Android Monitor shows
java.lang.UnsatisfiedLinkError: dlopen failed: library "libtango_client_api.so" not found
I'm attempting to use OpenCV with the NDK in Android Studio. As you may notice I'm using another native library called GStreamer.
My build.gradle:
apply plugin: 'com.android.application'
def getNdkCommandLine(ndkRoot, target) {
def gstRoot
def opencvRoot
gstRoot = 'C:/local/gstreamer-1.0-android-arm-1.8.0'
opencvRoot = 'C:/local/OpenCV-3.1.0-android-sdk/OpenCV-android-sdk'
if (ndkRoot == null)
throw new GradleException('NDK not configured')
return ["$ndkRoot/ndk-build.cmd",
'NDK_PROJECT_PATH=build',
'APP_BUILD_SCRIPT=src/main/jni/Android.mk',
'NDK_APPLICATION_MK=src/main/jni/Application.mk',
'GSTREAMER_JAVA_SRC_DIR=src/main/java',
"GSTREAMER_ROOT_ANDROID=$gstRoot",
"OPENCV_ROOT_ANDROID=$opencvRoot",
"$target"]
}
android {
compileSdkVersion 19
buildToolsVersion "23.0.2"
sourceSets {
main {
// Avoid using the built in JNI generation plugin
jni.srcDirs = []
jniLibs.srcDirs = ['build/libs']
}
}
defaultConfig {
applicationId "com.mytestcom.mytestapp"
minSdkVersion 19
targetSdkVersion 19
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
signingConfig signingConfigs.release
}
}
// Before compiling our app, prepare NDK code
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn ndkBuild
}
// Need to call clean on NDK ourselves too
clean.dependsOn 'ndkClean'
// Build native code using mk files like on Eclipse
task ndkBuild(type: Exec, description: 'Compile JNI source via NDK') {
commandLine getNdkCommandLine(android.ndkDirectory, 'TARGET_ARCH_ABI=armeabi-v7a')
}
task ndkClean(type: Exec, description: 'Clean JNI code built via NDK') {
commandLine getNdkCommandLine(android.ndkDirectory, 'clean')
}
//Renames APK to current versionName found in Android Manifest
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
def fileName = "My_Test_App-${versionName}.apk"
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
}
dependencies {
compile 'com.android.support:support-v4:19.1.0'
compile project(':openCVLibrary310')
}
Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := gstplayer
LOCAL_SRC_FILES := player.cpp
LOCAL_C_INCLUDES := $(OPENCV_ROOT_ANDROID)/sdk/native/jni/include
LOCAL_SHARED_LIBRARIES := gstreamer_android
LOCAL_LDLIBS := -llog -landroid
include $(BUILD_SHARED_LIBRARY)
ifeq ($(TARGET_ARCH_ABI),armeabi)
GSTREAMER_ROOT := $(GSTREAMER_ROOT_ARM)
else ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
GSTREAMER_ROOT := $(GSTREAMER_ROOT_ARMV7)
else ifeq ($(TARGET_ARCH_ABI),arm64-v8a)
GSTREAMER_ROOT := $(GSTREAMER_ROOT_ARM64)
else ifeq ($(TARGET_ARCH_ABI),x86)
GSTREAMER_ROOT := $(GSTREAMER_ROOT_X86)
else ifeq ($(TARGET_ARCH_ABI),x86_64)
GSTREAMER_ROOT := $(GSTREAMER_ROOT_X86_64)
else
$(error Target arch ABI not supported)
endif
ifndef GSTREAMER_ROOT
ifndef GSTREAMER_ROOT_ANDROID
$(error GSTREAMER_ROOT_ANDROID is not defined!)
endif
GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)
endif
GSTREAMER_NDK_BUILD_PATH := $(GSTREAMER_ROOT)/share/gst-android/ndk-build/
include $(GSTREAMER_NDK_BUILD_PATH)/plugins.mk
GSTREAMER_PLUGINS := $(GSTREAMER_PLUGINS_CORE) $(GSTREAMER_PLUGINS_PLAYBACK) $(GSTREAMER_PLUGINS_CODECS) $(GSTREAMER_PLUGINS_NET) $(GSTREAMER_PLUGINS_SYS) $(GSTREAMER_PLUGINS_CODECS_RESTRICTED) $(GSTREAMER_CODECS_GPL) $(GSTREAMER_PLUGINS_ENCODING) $(GSTREAMER_PLUGINS_VIS) $(GSTREAMER_PLUGINS_EFFECTS) $(GSTREAMER_PLUGINS_NET_RESTRICTED)
GSTREAMER_EXTRA_DEPS := gstreamer-player-1.0 gstreamer-video-1.0 glib-2.0
OPENCV_INSTALL_MODULES:=on
OPENCV_CAMERAMODULES:=off
OPENCV_LIB_TYPE:=STATIC
include $(GSTREAMER_NDK_BUILD_PATH)/gstreamer-1.0.mk
include $(OPENCV_ROOT_ANDROID)/sdk/native/jni/OpenCV.mk
Application.mk:
APP_PLATFORM=android-19
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi-v7a
I'm using OpenCV-3.1.0-android-sdk, NDK r10e, Android Studio 2.1, Windows. I've tried using a different version of OpenCV (2.4.11) but it didn't help.
C:\local\OpenCV-3.1.0-android-sdk\OpenCV-android-sdk\sdk\native\jni\include\opencv2\core\cvstd.hpp
Error:(625) undefined reference to 'cv::String::allocate(unsigned int)'
Error:(667) undefined reference to 'cv::String::deallocate()'
Error:(667) undefined reference to 'cv::String::deallocate()'
Error:(667) undefined reference to 'cv::String::deallocate()'
Error:(667) undefined reference to 'cv::String::deallocate()'
C:\local\OpenCV-3.1.0-android-sdk\OpenCV-android-sdk\sdk\native\jni\include\opencv2\core\mat.inl.hpp
Error:(443) undefined reference to 'cv::error(int, cv::String const&, char const*, char const*, int)'
Error:(459) undefined reference to 'cv::error(int, cv::String const&, char const*, char const*, int)'
Error:(682) undefined reference to 'cv::Mat::deallocate()'
Error:(571) undefined reference to 'cv::fastFree(void*)'
Error:(592) undefined reference to 'cv::Mat::copySize(cv::Mat const&)'
I ran into a similar issue a few days ago. Imo, you should try to replace LOCAL_LDLIBS := -llog -landroid with LOCAL_LDLIBS += -llog -landroid.
The explanation for these errors is that the OpenCV code being used in GStreamer doesn't have access to the rest of the library, so it's failing to find basic methods like allocate() and deallocate().
The solution was to include some prebuilt static libraries in the Android.mk so that these references are defined. So after include $(OPENCV_ROOT_ANDROID)/sdk/native/jni/OpenCV.mk I added these lines to add the relevant libraries:
include $(CLEAR_VARS)
LOCAL_MODULE := opencv-tbb
LOCAL_SRC_FILES := opencvLib/3rdparty/libs/$(TARGET_ARCH_ABI)/libtbb.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := opencv-core
LOCAL_SRC_FILES := opencvLib/$(TARGET_ARCH_ABI)/libopencv_core.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/opencvLib/include/
LOCAL_STATIC_LIBRARIES := opencv-tbb
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := opencv-imgproc
LOCAL_SRC_FILES := opencvLib/$(TARGET_ARCH_ABI)/libopencv_imgproc.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/opencvLib/include/
LOCAL_STATIC_LIBRARIES := opencv-core
include $(PREBUILT_STATIC_LIBRARY)
The LOCAL_EXPORT_C_INCLUDESvariable sets the include files that correspond to that library. In this case the include folder works for both libraries.
Now for the GStreamer code to be able to use these libraries we have to add LOCAL_STATIC_LIBRARIES := opencv-core opencv-imgproc to the gstplayer module which references the 2 added OpenCV modules.
Edit:
Also I forgot to mention I changed APP_STL := gnustl_static to APP_STL := gnustl_shared in Application.mk
I'm building a simple video app and want to embed a watermark on the recorded videos. I am using ffmpeg for this process and have successfully compiled it. The issue is when I try to link it with my project in Android Studio using ndk-build.cmd command, it gives me the following error:
C:\Users\MyPC\AppData\Local\Temp\ccIRLDZn.s: Assembler messages:
C:\Users\MyPC\AppData\Local\Temp\ccIRLDZn.s:8547: Error: unknown mnemonic `itt' -- `itt gt'
C:\Users\MyPC\AppData\Local\Temp\ccIRLDZn.s:8548: Error: unknown mnemonic `movgt' -- `movgt x25,x0'
C:\Users\MyPC\AppData\Local\Temp\ccIRLDZn.s:8549: Error: unknown mnemonic `movgt' -- `movgt x0,x1'
C:\Users\MyPC\AppData\Local\Temp\ccIRLDZn.s:8551: Error: unknown mnemonic `it' -- `it le'
C:\Users\MyPC\AppData\Local\Temp\ccIRLDZn.s:8552: Error: unknown mnemonic `movle' -- `movle x0,x2'
C:\Users\MyPC\AppData\Local\Temp\ccIRLDZn.s:8554: Error: unknown mnemonic `it' -- `it gt'
C:\Users\MyPC\AppData\Local\Temp\ccIRLDZn.s:8555: Error: unknown mnemonic `movgt' -- `movgt x25,x0'
make: *** [obj/local/arm64-v8a/objs/myProject_Videokit/ffmpeg.o] Error 1
My development environment is
OS : Windows10 x86_64
Command line : Cygwin 64bit
Android NDK version : android-ndk-r11c
ffmpeg version : ffmpeg-3.0.2
Android Studio : 2.1.1
First, I installed Cygwin64bit and added 'make', 'dos2unix', 'c++ gcc' packages. And I decompressed ffmpeg folder in C:/android-ndk-r11c/sources. This is the build script I used.
config.sh
#!/bin/bash
NDK=C:/android-ndk-r11c
SYSROOT=$NDK/platforms/android-9/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64
#I used cygpath to avoid path errors in Cygwin.
CUR="$(cygpath -m "$(pwd)")"
TEMPDIR="$(cygpath -m "/tmp")"
TMP="$(cygpath -m "/tmp")"
TMPDIR="$(cygpath -m "/tmp")"
CPU=arm
PREFIX=$CUR/android/$CPU
ADDI_CFLAGS="-marm"
./configure
--prefix=$PREFIX
--enable-shared
--disable-static
--disable-doc
--disable-ffmpeg
--disable-ffplay
--disable-ffprobe
--disable-ffserver
--disable-doc
--disable-symver
--enable-protocol=concat
--enable-protocol=file
--enable-muxer=mp4
--enable-demuxer=mpegts
--enable-memalign-hack
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi-
--target-os=linux
--arch=arm
--enable-cross-compile
--sysroot=$SYSROOT
--extra-cflags="-Os -fpic $ADDI_CFLAGS"
--extra-ldflags="$ADDI_LDFLAGS"
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
I ran this .sh in Cygwin(as administrator) but it didn't work. So I typed each of those lines on Cygwin and it compiled successfully. I tried both --target-os=android and --target-os=linux, but both didn't solve the problem above.
Then I followed this tutorial (enoent.fr/blog/2014/06/20/compile-ffmpeg-for-android/). Based on that, I made a native method in my project and built header file and c file.(To do that, I followed this video. youtube.com/watch?v=kFtxo7rr2HQ)
After that, I cloned this repo(github.com/HikoQiu/JNI_INVOKE_FFMPEG) and copied - pasted the jni folder into my project. And after making the Android.mk and Application.mk, I ran the C:/android-ndk-r11c/ndk-build.cmd in the Android Studio terminal and it gave me the error above.
These are the Makefiles I used.
myProject/app/src/main/jni/Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := com_example_project_Videokit
LOCAL_LDLIBS := -llog -ljnigraphics -lz
LOCAL_CFLAGS := -Wdeprecated-declarations
ANDROID_LIB := -landroid
LOCAL_C_INCLUDES := C:\android-ndk-r11c\sources\ffmpeg-3.0.2
LOCAL_SRC_FILES := com_example_project_Videokit.c ffmpeg.c ffmpeg_filter.c ffmpeg_opt.c cmdutils.c
LOCAL_SHARED_LIBRARIES := libavformat libavcodec libswscale libavutil
include $(BUILD_SHARED_LIBRARY)
$(call import-module,ffmpeg-3.0.2/android/arm)
myProject/app/src/main/jni/Application.mk
APP_ABI := all
C:/android-ndk-r11c/sources/ffmpeg-3.0.2/android/arm/Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= libavcodec
LOCAL_SRC_FILES:= lib/libavcodec-57.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE:= libavformat
LOCAL_SRC_FILES:= lib/libavformat-57.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE:= libswscale
LOCAL_SRC_FILES:= lib/libswscale-4.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE:= libavutil
LOCAL_SRC_FILES:= lib/libavutil-55.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE:= libavfilter
LOCAL_SRC_FILES:= lib/libavfilter-6.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE:= libwsresample
LOCAL_SRC_FILES:= lib/libswresample-2.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
And this is my project structure so far. com_example_myProjct.c is the file that I used as a moduleName in build.gradle file and as LOCAL_MODULE in Android.mk .
app
- build
- libs
- src
- androidTest
- main
- java
-com.example.myProject
-MainActivity
-Videokit //this is the class where I called the native method.
- jni
-Android.mk
-Application.mk
-cmdutils.c
-cmdutils.h
-com_example_myProject.c
-com_example_myProject.h
-ffmpeg.c
-ffmpeg.h
-ffmpeg_filter.c
-ffmpeg_opt.c
-ffmpeg_opt.h
-logjam.h
- obj
- res
AndroidManifest.xml
- test
app/gradle.build
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "com.example.myProjct"
minSdkVersion 14
targetSdkVersion 23
versionCode 1
versionName "1.0.0"
ndk {
moduleName "com_example_myProjet_Videokit"
}
sourceSets.main {
jni.srcDirs = []
jniLibs.srcDir 'src/main/libs'
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-rules.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'
}
Any ideas?
As the last line of your compilation error report says:
make: *** [obj/local/arm64-v8a/objs/myProject_Videokit/ffmpeg.o] Error 1
It's the key. You're trying to build your application for all available ABI's. As I can see your build.gradle file, there's no abiFilter. I'd do it in a next manner (I'm not sure with syntax, but the):
android {
...
ndk {
moduleName "com_example_myProjet_Videokit"
abiFilters = "x86", "armeabi"
}
...
}
If I were you, I'd use gradle-experimental plugin, prebuild ffmpeg libs for all needed ABI's, and then use this approach to load the libraries.
So the main problem - you have one library for all ABI's. It's incorrect.
During running build_native.py i get error "ExtensionMacros.h" no such file or directory.
The file itself is in cocos2d\extensions. I edited android.mk and uncommented line resposnsible for including this file. Why wont it find it?
Here is my android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
$(call import-add-path,$(LOCAL_PATH)/../../cocos2d)
$(call import-add-path,$(LOCAL_PATH)/../../cocos2d/external)
$(call import-add-path,$(LOCAL_PATH)/../../cocos2d/cocos)
$(call import-add-path,$(LOCAL_PATH)/../../cocos2d/extensions)
LOCAL_MODULE := cocos2dcpp_shared
LOCAL_MODULE_FILENAME := libcocos2dcpp
LOCAL_SRC_FILES := hellocpp/main.cpp \
../../Classes/AppDelegate.cpp \
../../Classes/HelloWorldScene.cpp \
../../Classes/Boxx.cpp \
../../Classes/World.cpp \
../../Classes/U.cpp \
../../Classes/CarrerWorld.cpp \
../../Classes/VisibleRect.cpp
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes
LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocosdenshion_static
# LOCAL_WHOLE_STATIC_LIBRARIES += box2d_static
# LOCAL_WHOLE_STATIC_LIBRARIES += cocosbuilder_static
# LOCAL_WHOLE_STATIC_LIBRARIES += spine_static
# LOCAL_WHOLE_STATIC_LIBRARIES += cocostudio_static
# LOCAL_WHOLE_STATIC_LIBRARIES += cocos_network_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_extension_static
include $(BUILD_SHARED_LIBRARY)
$(call import-module,.)
$(call import-module,audio/android)
# $(call import-module,Box2D)
# $(call import-module,editor-support/cocosbuilder)
# $(call import-module,editor-support/spine)
# $(call import-module,editor-support/cocostudio)
# $(call import-module,network)
$(call import-module,extensions)
and the top of error source cpp file :
#include "World.h"
#include "U.h"
#include "Boxx.h"
#include "Globals.h"
#include "VisibleRect.h"
#include "extensions/cocos-ext.h" //<---- this file includes "extensionMacros.h"
USING_NS_CC;
USING_NS_CC_EXT;
Does cocos2d/extensions/Android.mk have the line?
LOCAL_C_INCLUDES := $(LOCAL_PATH)/..
https://github.com/cocos2d/cocos2d-x/blob/v3/extensions/Android.mk#L40
It needs to find the header file.
After a day and a half of modification I've finally gotten the VLC project to almost compile under OS X. I get the following error when its just about to link libvlcjni.so. There are roughly 100 more undefined references, but most are to few functions:
std::__stl_throw_length_error(char const*)
std::__node_alloc::_M_deallocate(void*, unsigned int)
Has anyone got any pointers?
Compile thumb : vlcjni <= aout.c
Compile thumb : vlcjni <= pthread-condattr.c
Compile thumb : vlcjni <= pthread-rwlocks.c
Compile thumb : vlcjni <= eventfd.c
Compile thumb : vlcjni <= sem.c
SharedLibrary : libvlcjni.so
../vlc/android/modules/demux/mkv/.libs/libmkv_plugin.a(libmkv_plugin_la-mkv.o): In function std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_compare(char const*, char const*, char const*, char const*)':
/Android/ndk/sources/cxx-stl/stlport/stlport/stl/_string.h:1076: undefined reference tostd::__stl_throw_out_of_range(char const*)'
Application.mk
APP_PLATFORM := android-9
ifeq ($(NO_NEON),)
APP_ABI := armeabi-v7a
else ifneq ($(TEGRA2),)
APP_ABI := armeabi-v7a
else
APP_ABI := armeabi
endif
APP_STL := gnustl_static
APP_PLATFORM := android-9
APP_ABI := armeabi-v7a
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
ifeq ($(NO_NEON),)
ARCH=armeabi-v7a
LOCAL_MODULE := libvlcjni
else ifneq ($(TEGRA2),)
ARCH=armeabi-v7a
LOCAL_MODULE := libvlcjni-tegra2
else
ARCH=armeabi
LOCAL_MODULE := libvlcjni
endif
LOCAL_SRC_FILES := libvlcjni_danmaku.c aout.c pthread-condattr.c pthread-rwlocks.c eventfd.c sem.c
LOCAL_C_INCLUDES := $(VLC_SRC_DIR)/include
ifeq ($(NO_NDK_V7),1)
CPP_STATIC=$(ANDROID_NDK)/sources/cxx-stl/gnu-libstdc++/libs/$(ARCH)/libstdc++.a
else
CPP_STATIC=$(ANDROID_NDK)/sources/cxx-stl/stlport/libs/$(ARCH)/libstlport_static.a
endif
LOCAL_CFLAGS := -std=gnu99
LOCAL_LDLIBS := -L$(VLC_CONTRIB)/lib \
$(VLC_MODULES) \
$(VLC_BUILD_DIR)/lib/.libs/libvlc.a \
$(VLC_BUILD_DIR)/src/.libs/libvlccore.a \
$(VLC_BUILD_DIR)/compat/.libs/libcompat.a \
-ldl -lz -lm -llog \
-ldvbpsi -lebml -lmatroska -ltag \
-logg -lFLAC -ltheora \
-lmpeg2 -ldca -la52 \
-lavformat -lavcodec -lswscale -lavutil -lpostproc -lgsm -lopenjpeg \
-lliveMedia -lUsageEnvironment -lBasicUsageEnvironment -lgroupsock \
-lspeex -lspeexdsp \
-lxml2 -lpng -lgnutls -lgcrypt -lgpg-error -lfreetype -liconv \
$(CPP_STATIC)
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libiomx-gingerbread
LOCAL_SRC_FILES := ../$(VLC_SRC_DIR)/modules/codec/omxil/iomx.cpp
LOCAL_C_INCLUDES := $(VLC_SRC_DIR)/modules/codec/omxil $(ANDROID_SYS_HEADERS_GINGERBREAD)/frameworks/base/include $(ANDROID_SYS_HEADERS_GINGERBREAD)/system/core/include
LOCAL_LDLIBS := -L$(ANDROID_LIBS) -lgcc -lstagefright -lmedia -lutils -lbinder
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libiomx-hc
LOCAL_SRC_FILES := ../$(VLC_SRC_DIR)/modules/codec/omxil/iomx.cpp
LOCAL_C_INCLUDES := $(VLC_SRC_DIR)/modules/codec/omxil $(ANDROID_SYS_HEADERS_HC)/frameworks/base/include $(ANDROID_SYS_HEADERS_HC)/frameworks/base/native/include $(ANDROID_SYS_HEADERS_HC)/system/core/include $(ANDROID_SYS_HEADERS_HC)/hardware/libhardware/include
LOCAL_LDLIBS := -L$(ANDROID_LIBS) -lgcc -lstagefright -lmedia -lutils -lbinder
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libiomx-ics
LOCAL_SRC_FILES := ../$(VLC_SRC_DIR)/modules/codec/omxil/iomx.cpp
LOCAL_C_INCLUDES := $(VLC_SRC_DIR)/modules/codec/omxil $(ANDROID_SYS_HEADERS_ICS)/frameworks/base/include $(ANDROID_SYS_HEADERS_ICS)/frameworks/base/native/include $(ANDROID_SYS_HEADERS_ICS)/system/core/include $(ANDROID_SYS_HEADERS_ICS)/hardware/libhardware/include
LOCAL_LDLIBS := -L$(ANDROID_LIBS) -lgcc -lstagefright -lmedia -lutils -lbinder
include $(BUILD_SHARED_LIBRARY)
Try to include these lines into your Application.mk:
APP_CPPFLAGS += -frtti
APP_CPPFLAGS += -fexceptions
You have to explicitly enable the RTTI and Exceptions handling.
EDIT (response to your modifications):
# These are your lines in Application.mk
APP_PLATFORM := android-9
ifeq ($(NO_NEON),)
APP_ABI := armeabi-v7a
else ifneq ($(TEGRA2),)
APP_ABI := armeabi-v7a
else
APP_ABI := armeabi
endif
# Add these lines:
APP_CPPFLAGS += -frtti
APP_CPPFLAGS += -fexceptions
# I haven't seen them