I am using this to build ffmpeg on ndk:
roman10's android ndk r9d - ffmpeg tutorial
The link shows how to compile, but its not clear how to use it. Can anybody guide me? Thanks.
After ndk-build from my project root i was able to generate .so files inside libs/armeabi and obj/local/armeabi.. Now I am getting findLibrary returned null?? What to do now?
java.lang.UnsatisfiedLinkError: Couldn't load libavutil from loader dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.palak.androidffmpegroman-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.palak.androidffmpegroman-2, /vendor/lib, /system/lib]]]: findLibrary returned null
at java.lang.Runtime.loadLibrary(Runtime.java:358)
at java.lang.System.loadLibrary(System.java:526)
at com.palak.androidffmpegroman.MainActivity.<clinit>(MainActivity.java:175)
at java.lang.Class.newInstanceImpl(Native Method)
at java.lang.Class.newInstance(Class.java:1208)
at android.app.Instrumentation.newActivity(Instrumentation.java:1061)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2101)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
at android.app.ActivityThread.access$800(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)
my project structure:
My build_android.sh
#!/bin/bash
NDK=$HOME/NDK/android-ndk-r10d
SYSROOT=$NDK/platforms/android-19/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86
function build_one
{
sudo ./configure \
--prefix=$PREFIX \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-avdevice \
--disable-doc \
--disable-symver \
--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
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
build_one
I am using Ndk r10, ffmpeg 2.5.4, ubuntu x86.
Edit: Android.mk
LOCAL_PATH:= /home/palak/NDK/ffmpeg-2.5.4/android/arm
include $(CLEAR_VARS)
LOCAL_MODULE:= libavcodec
LOCAL_SRC_FILES:= lib/libavcodec-56.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE:= libavformat
LOCAL_SRC_FILES:= lib/libavformat-56.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE:= libswscale
LOCAL_SRC_FILES:= lib/libswscale-3.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE:= libavutil
LOCAL_SRC_FILES:= lib/libavutil-54.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE:= libavfilter
LOCAL_SRC_FILES:= lib/libavfilter-5.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE:= libswresample
LOCAL_SRC_FILES:= lib/libswresample-1.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
Android.mk under jni folder:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := tutorial01
LOCAL_SRC_FILES := tutorial01.c
LOCAL_LDLIBS := -llog -ljnigraphics -lz
LOCAL_SHARED_LIBRARIES := avformat avcodec swscale avutil
include $(BUILD_SHARED_LIBRARY)
$(call import-module,ffmpeg-2.5.4/android/arm)
LOCAL_MODULE:= libavutil
-->
LOCAL_MODULE:= avutil # libavutil.so
example (used to work):
https://github.com/18446744073709551615/reDroid/blob/master/jni/Android.mk
UPDATE:
Once again: you do not need the lib prefixes in library names; LOCAL_MODULE:= avutil will give you libavutil.so
At second, what parameter do you pass to loadLibrary()? Again, it should be "avutil" for libavutil.so.
If you have problems, the best way is to start with the hello-jni example in the NDK (your-ndk-dir/samples/hello-jni/)
/* this is used to load the 'hello-jni' library on application
* startup. The library has already been unpacked into
* /data/data/com.example.hellojni/lib/libhello-jni.so <== !!!!!!!!!!!!!
* at installation time by the package manager.
*/
static {
System.loadLibrary("hello-jni");
}
Once the example compiles and runs, you may add your libraries to it and have your stuff work.
You use name libavutil to refer to libavutil-54.so during ndk-build. This is fine, but the runtime lib is still called libavutil-54.so. Moreover, your other modules, including tutorial01, know it by this name, so renaming it in libs/armeabi will also be wrong.
You need something like
static {
System.loadLibrary("avutil-54");
System.loadLibrary("avcodec-56");
System.loadLibrary("avformat-56");
System.loadLibrary("swscale-3");
System.loadLibrary("tutorial01");
}
In recent version of Android, the system will automatically resolve the local external references, so it's enough to call
static {
System.loadLibrary("tutorial01");
}
Replace your
LOCAL_SHARED_LIBRARIES := avformat avcodec swscale avutil
with
LOCAL_SHARED_LIBRARIES := libavformat libavcodec libswscale libavutil libavfilter libswresample
in Android.mk in your Jni folder.
And Load the libraries like below
static {
System.loadLibrary("avutil-54");
System.loadLibrary("avcodec-56");
System.loadLibrary("avformat-56");
System.loadLibrary("swscale-3");
System.loadLibrary("avfilter-5");
System.loadLibrary("swresample-1");
System.loadLibrary("tutorial01");
}
Are you sure that you are using a phone with an armeabi processor? Add the armeabiv7 in the Application.mk file and it will compile the required files for armeabiv7 phones in the libs folder.
APP_ABI := armeabi armeabi-v7a x86
This should work.
Related
I would like to compile opus on android for one project.
I use a Android.mk to compile it.
It looks like that:
ROOT := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_PATH := $(ROOT)/opus-1.1
LOCAL_MODULE := libopus
LOCAL_SRC_FILES := celt/bands.c celt/celt.c celt/celt_decoder.c celt/celt_lpc.c celt/cwrs.c \
celt/entcode.c celt/entdec.c celt/entenc.c celt/kiss_fft.c \
celt/laplace.c celt/mathops.c celt/mdct.c celt/modes.c \
celt/pitch.c celt/quant_bands.c celt/rate.c celt/vq.c \
silk/A2NLSF.c silk/ana_filt_bank_1.c silk/biquad_alt.c \
silk/bwexpander_32.c silk/bwexpander.c \
silk/check_control_input.c silk/CNG.c silk/code_signs.c \
silk/control_audio_bandwidth.c silk/control_codec.c \
silk/control_SNR.c silk/debug.c silk/dec_API.c \
silk/decode_core.c silk/decode_frame.c silk/decode_indices.c \
silk/decode_parameters.c silk/decode_pitch.c \
silk/decode_pulses.c silk/decoder_set_fs.c silk/enc_API.c \
silk/encode_indices.c silk/encode_pulses.c silk/gain_quant.c \
silk/HP_variable_cutoff.c silk/init_decoder.c \
silk/init_encoder.c silk/inner_prod_aligned.c \
silk/interpolate.c silk/lin2log.c silk/log2lin.c \
silk/LPC_analysis_filter.c silk/LPC_inv_pred_gain.c \
silk/LP_variable_cutoff.c silk/NLSF2A.c silk/NLSF_decode.c \
silk/NLSF_del_dec_quant.c silk/NLSF_encode.c \
silk/NLSF_stabilize.c silk/NLSF_unpack.c silk/NLSF_VQ.c \
silk/NLSF_VQ_weights_laroia.c silk/NSQ.c silk/NSQ_del_dec.c \
silk/pitch_est_tables.c silk/PLC.c silk/process_NLSFs.c \
silk/quant_LTP_gains.c silk/resampler.c \
silk/resampler_down2_3.c silk/resampler_down2.c \
silk/resampler_private_AR2.c \
silk/resampler_private_down_FIR.c \
silk/resampler_private_IIR_FIR.c \
silk/resampler_private_up2_HQ.c silk/resampler_rom.c \
silk/shell_coder.c silk/sigm_Q15.c silk/sort.c \
silk/stereo_decode_pred.c silk/stereo_encode_pred.c \
silk/stereo_find_predictor.c silk/stereo_LR_to_MS.c \
silk/stereo_MS_to_LR.c silk/stereo_quant_pred.c \
silk/sum_sqr_shift.c silk/table_LSF_cos.c \
silk/tables_gain.c silk/tables_LTP.c \
silk/tables_NLSF_CB_NB_MB.c silk/tables_NLSF_CB_WB.c \
silk/tables_other.c silk/tables_pitch_lag.c \
silk/tables_pulses_per_block.c silk/VAD.c silk/VQ_WMat_EC.c \
silk/fixed/apply_sine_window_FIX.c silk/fixed/autocorr_FIX.c \
silk/fixed/burg_modified_FIX.c silk/fixed/corrMatrix_FIX.c \
silk/fixed/encode_frame_FIX.c silk/fixed/find_LPC_FIX.c \
silk/fixed/find_LTP_FIX.c silk/fixed/find_pitch_lags_FIX.c \
silk/fixed/find_pred_coefs_FIX.c silk/fixed/k2a_FIX.c \
silk/fixed/k2a_Q16_FIX.c \
silk/fixed/LTP_analysis_filter_FIX.c \
silk/fixed/LTP_scale_ctrl_FIX.c \
silk/fixed/noise_shape_analysis_FIX.c \
silk/fixed/pitch_analysis_core_FIX.c \
silk/fixed/prefilter_FIX.c \
silk/fixed/process_gains_FIX.c \
silk/fixed/regularize_correlations_FIX.c \
silk/fixed/residual_energy16_FIX.c \
silk/fixed/residual_energy_FIX.c \
silk/fixed/schur64_FIX.c silk/fixed/schur_FIX.c \
silk/fixed/solve_LS_FIX.c \
silk/fixed/vector_ops_FIX.c src/opus.c src/opus_compare.c \
src/opus_decoder.c src/opus_encoder.c \
src/opus_multistream.c src/repacketizer.c
LOCAL_CFLAGS := -I$(LOCAL_PATH)/include -I$(LOCAL_PATH)/celt -I$(LOCAL_PATH)/silk -I$(LOCAL_PATH)/silk/fixed -Drestrict='' -D__EMX__ -DOPUS_BUILD -DFIXED_POINT -DUSE_ALLOCA -DHAVE_LRINT -DHAVE_LRINTF -O3 -fno-math-errno
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_PATH := $(ROOT)
LOCAL_MODULE := receiver-jni
LOCAL_SRC_FILES := osl_receiver.c spsc_circular_queue.c
LOCAL_CFLAGS := -std=c99
LOCAL_C_INCLUDES:= $(LOCAL_PATH)/opus-1.1/include
LOCAL_LDLIBS := -lOpenSLES -llog -lz -lm
LOCAL_STATIC_LIBRARIES := libopus
include $(BUILD_SHARED_LIBRARY)
It's perfectly compile for mips64, mips, x86_64, x86, arm64-v8a, armeabi-v7a
But when gradle is trying to compile for armeabi, I have an issue.
[armeabi] Compile thumb : opus <= NSQ_del_dec.c
fatal error: error in backend: Cannot select: 0x314f020: i32 = ARMISD::SSAT 0x30e3a30, Constant:i32<15>
0x30e3a30: i32 = sra 0x30e38e0, Constant:i32<1>
0x30e38e0: i32 = add 0x30e0bd0, Constant:i32<1>
0x30e0bd0: i32 = sra 0x3153cf0, Constant:i32<7>
0x3153cf0: i32 = add 0x30b45e0, 0x30b1e50
0x30b45e0: i32 = add 0x30e1110, 0x30e0fc0
0x30e1110: i32 = sra 0x30b24e0, Constant:i32<16>
[...]
In function: silk_noise_shape_quantizer_del_dec
clang: error: clang frontend command failed with exit code 70 (use -v to see invocation)
Android clang version 3.8.275480 (based on LLVM 3.8.275480)
Target: armv5te-none-linux-android
Thread model: posix
InstalledDir: /home/maathor/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin
clang: note: diagnostic msg: PLEASE submit a bug report to http://llvm.org/bugs/ and include the crash backtrace, preprocessed source, and associated run script.
clang: note: diagnostic msg:
********************
PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
clang: note: diagnostic msg: /tmp/NSQ_del_dec-110b1d.c
clang: note: diagnostic msg: /tmp/NSQ_del_dec-110b1d.sh
clang: note: diagnostic msg:
********************
make: *** [/home/maathor/app/smplayerapp/android/TestImport/app/build/intermediates/ndkBuild/debug/obj/local/armeabi/objs-debug/opus/silk/NSQ_del_dec.o] Error 70
:app:externalNativeBuildDebug FAILED
:app:buildInfoGeneratorDebug
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:externalNativeBuildDebug'.
> Build command failed.
Error while executing process /home/maathor/Android/Sdk/ndk-bundle/ndk-build with arguments {NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=/home/maathor/app/smplayerapp/android/TestImport/app/src/main/jni/Android.mk APP_ABI=armeabi NDK_ALL_ABIS=armeabi NDK_DEBUG=1 APP_PLATFORM=android-15 NDK_OUT=/home/maathor/app/smplayerapp/android/TestImport/app/build/intermediates/ndkBuild/debug/obj NDK_LIBS_OUT=/home/maathor/app/smplayerapp/android/TestImport/app/build/intermediates/ndkBuild/debug/lib /home/maathor/app/smplayerapp/android/TestImport/app/build/intermediates/ndkBuild/debug/obj/local/armeabi/libreceiver-jni.so}
[armeabi] Compile thumb : receiver-jni <= osl_receiver.c
Do you understand something ? I just would like to build it for my Samsung Galaxy 5 on 6.0.1 !
Thanks for your reply !
ANSWER:
After many tests, it's perfectly work with NDK 13 B (the october 2016 version)
After many tests, it's perfectly work with NDK 13 B (the october 2016 version)
I am trying to show h264 encodes streams inside an android application using the GStreamer SDK and Android NDK.
My Android.mk looks like:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := App
LOCAL_SRC_FILES := App.cpp
LOCAL_SHARED_LIBRARIES := gstreamer_android
LOCAL_LDLIBS := -llog -landroid
include $(BUILD_SHARED_LIBRARY)
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_SYS) $(GSTREAMER_PLUGINS_EFFECTS) $(GSTREAMER_PLUGINS_NET)
GSTREAMER_EXTRA_DEPS := gstreamer-video-1.0
include $(GSTREAMER_NDK_BUILD_PATH)/gstreamer-1.0.mk
Beacause of missing plugins-bad I get the following error:
priv_gst_parse_yyparse no element "h264parse"
My pipe looks like the following:
udpsrc address=192.168.0.1 port=5000 ! application/x-rtp, encoding-name=H264, payload=96 ! rtph264depay ! h264parse ! avdec_h264 ! autovideosink
So how can I include the gstreamer-plugins-bad into android build?
Try adding this line instead the one you have:
GSTREAMER_PLUGINS := $(GSTREAMER_PLUGINS_CORE) $(GSTREAMER_PLUGINS_PLAYBACK) $(GSTREAMER_PLUGINS_CODECS) $(GSTREAMER_PLUGINS_NET) $(GSTREAMER_PLUGINS_SYS) $(GSTREAMER_PLUGINS_CODECS_RESTRICTED)
Specifically this one should do the job $(GSTREAMER_PLUGINS_CODECS_RESTRICTED)
You can add this line :
GSTREAMER_PLUGINS := $(GSTREAMER_PLUGINS_CORE) $(GSTREAMER_PLUGINS_PLAYBACK) $(GSTREAMER_PLUGINS_CODECS) $(GSTREAMER_PLUGINS_NET) $(GSTREAMER_PLUGINS_SYS) $(GSTREAMER_PLUGINS_CODECS_RESTRICTED) $(GSTREAMER_PLUGINS_EFFECTS)
in your path : app/jni/Android.mk
Good day Everyone. I have wasted almost a week now figuring what's wrong when i try adding libxml2 to my android ndk project.
LOCAL_PATH := $(call my-dir)
#BUILDING LIBXML2
include $(CLEAR_VARS)
LOCAL_MODULE := xml2
LOCAL_SRC_FILES := $(LOCAL_PATH)/libxml2/libxml2.a
LOCAL_C_INCLUDES := $(LOCAL_PATH)/libxml2/include
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/libxml2/include
LOCAL_DISABLE_FORMAT_STRING_CHECKS := true
include $(BUILD_SHARED_LIBRARY)
#BUILDING SOME SPICE CODES
include $(CLEAR_VARS)
LIB_PATH := $(LOCAL_PATH)/../../libs/armeabi
SPICE_CLIENT_ANDROID_DEPS := $(LOCAL_PATH)/../libs/deps
spice_objs := \
$(SPICE_CLIENT_ANDROID_DEPS)/lib/libssl.a \
$(SPICE_CLIENT_ANDROID_DEPS)/lib/libcrypto.a \
$(SPICE_CLIENT_ANDROID_DEPS)/lib/libcelt051.a
LOCAL_MODULE := spice
LOCAL_SRC_FILES := channel-record.c channel-playback.c channel-cursor.c \
spice-cmdline.c coroutine_gthread.c spice-util.c \
spice-session.c spice-channel.c spice-marshal.c spice-glib-enums.c \
common/generated_client_demarshallers.c common/generated_client_demarshallers1.c \
common/generated_client_marshallers.c common/generated_client_marshallers1.c \
gio-coroutine.c channel-base.c channel-main.c spice-proxy.c bio-gsocket.c glib-compat.c \
channel-display.c channel-display-mjpeg.c channel-inputs.c decode-glz.c \
decode-jpeg.c decode-zlib.c wocky-http-proxy.c channel-port.c spice-client.c spice-audio.c \
common/mem.c common/marshaller.c common/canvas_utils.c common/backtrace.c \
common/sw_canvas.c common/pixman_utils.c common/lines.c common/rop3.c common/quic.c \
common/lz.c common/region.c common/ssl_verify.c common/log.c spice-gstaudio.c
LOCAL_LDLIBS += $(spice_objs) \
-ljnigraphics -llog -ldl -lstdc++ -lz -lc \
-malign-double -malign-loops
LOCAL_LDLIBS += -L$(LIB_PATH) -lgstreamer_android
LOCAL_CPPFLAGS += -DG_LOG_DOMAIN=\"GSpice\" \
-DSW_CANVAS_CACHE \
-DSPICE_GTK_LOCALEDIR=\"/usr/local/share/locale\" \
-DHAVE_CONFIG_H -UHAVE_SYS_SHM_H -DSW_CANVAS_CACHE \
-D_REENTRANT -DWITH_GSTAUDIO
LOCAL_C_INCLUDES += $(LOCAL_PATH)/common \
$(SPICE_CLIENT_ANDROID_DEPS)/include
LOCAL_CFLAGS := $(LOCAL_CPPFLAGS) \
-std=gnu99 -Wall -Wno-sign-compare -Wno-deprecated-declarations -Wl,--no-undefined \
-fPIC -DPIC -O3 -funroll-loops -ffast-math
LOCAL_EXPORT_CFLAGS += $(LOCAL_CFLAGS)
LOCAL_EXPORT_LDLIBS += $(LOCAL_LDLIBS)
LOCAL_SHARED_LIBRARIES := gstreamer_android
LOCAL_ARM_MODE := arm
include $(BUILD_STATIC_LIBRARY)
#BUILDING SOME MINE C CODE --------Here i add Mine C file and xml2 for it
include $(CLEAR_VARS)
LOCAL_MODULE := start-spice
LOCAL_SRC_FILES := start-spice.c
LOCAL_SHARED_LIBRARIES= xml2
include $(BUILD_SHARED_LIBRARY)
#BUILDING SPICE ANDROID
include $(CLEAR_VARS)
LOCAL_MODULE := spice-android
LOCAL_SRC_FILES := android/android-service.c android/android-spicy.c android/android-spice-widget.c \
android/android-io.c
LOCAL_STATIC_LIBRARIES := spice
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
ifndef GSTREAMER_SDK_ROOT
ifndef GSTREAMER_SDK_ROOT_ANDROID
$(error GSTREAMER_SDK_ROOT_ANDROID is not defined!)
endif
GSTREAMER_SDK_ROOT := $(GSTREAMER_SDK_ROOT_ANDROID)
endif
GSTREAMER_NDK_BUILD_PATH := $(GSTREAMER_SDK_ROOT)/share/gst-android/ndk-build/
include $(GSTREAMER_NDK_BUILD_PATH)/plugins.mk
GSTREAMER_PLUGINS := $(GSTREAMER_PLUGINS_CORE) $(GSTREAMER_PLUGINS_SYS) jpeg
GSTREAMER_EXTRA_DEPS := glib-2.0 gthread-2.0 pixman-1 gstreamer-app-0.10
include $(GSTREAMER_NDK_BUILD_PATH)/gstreamer.mk
So even after I add xml2.so as shared library to my project - nothing happens. It strill cannot find libs and gives me tons of this
[armeabi] SharedLibrary : libstart-spice.so
/opt/android-ndk-r9c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: /opt/Test6/bVNC/eclipse_projects/bVNC/obj/local/armeabi/objs/start-spice/start-spice.o: in function create_request:/opt/Test6/bVNC/eclipse_projects/bVNC/jni/src/start-spice.c:251: error: undefined reference to 'xmlNewDoc'
/opt/android-ndk-r9c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: /opt/Test6/bVNC/eclipse_projects/bVNC/obj/local/armeabi/objs/start-spice/start-spice.o: in function create_request:/opt/Test6/bVNC/eclipse_projects/bVNC/jni/src/start-spice.c:252: error: undefined reference to 'xmlNewNode'
/opt/android-ndk-r9c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: /opt/Test6/bVNC/eclipse_projects/bVNC/obj/local/armeabi/objs/start-spice/start-spice.o: in function create_request:/opt/Test6/bVNC/eclipse_projects/bVNC/jni/src/start-spice.c:253: error: undefined reference to 'xmlNodeSetContent'
/opt/android-ndk-r9c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: /opt/Test6/bVNC/eclipse_projects/bVNC/obj/local/armeabi/objs/start-spice/start-spice.o: in function create_request:/opt/Test6/bVNC/eclipse_projects/bVNC/jni/src/start-spice.c:254: error: undefined reference to 'xmlDocSetRootElement'
/opt/android-ndk-r9c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: /opt/Test6/bVNC/eclipse_projects/bVNC/obj/local/armeabi/objs/start-spice/start-spice.o: in function create_request:/opt/Test6/bVNC/eclipse_projects/bVNC/jni/src/start-spice.c:255: error: undefined reference to 'xmlDocDumpFormatMemory'
/opt/android-ndk-r9c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: /opt/Test6/bVNC/eclipse_projects/bVNC/obj/local/armeabi/objs/start-spice/start-spice.o: in function create_request:/opt/Test6/bVNC/eclipse_projects/bVNC/jni/src/start-spice.c:256: error: undefined reference to 'xmlFreeDoc'
/opt/android-ndk-r9c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: /opt/Test6/bVNC/eclipse_projects/bVNC/obj/local/armeabi/objs/start-spice/start-spice.o: in function Java_com_iiordanov_bVNC_NativeCalls_getPortAndPassword:/opt/Test6/bVNC/eclipse_projects/bVNC/jni/src/start-spice.c:144: error: undefined reference to 'xmlReadMemory'
/opt/android-ndk-r9c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: /opt/Test6/bVNC/eclipse_projects/bVNC/obj/local/armeabi/objs/start-spice/start-spice.o: in function Java_com_iiordanov_bVNC_NativeCalls_getPortAndPassword:/opt/Test6/bVNC/eclipse_projects/bVNC/jni/src/start-spice.c:153: error: undefined reference to 'xmlDocGetRootElement'
/opt/android-ndk-r9c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: /opt/Test6/bVNC/eclipse_projects/bVNC/obj/local/armeabi/objs/start-spice/start-spice.o: in function Java_com_iiordanov_bVNC_NativeCalls_getPortAndPassword:/opt/Test6/bVNC/eclipse_projects/bVNC/jni/src/start-spice.c:163: error: undefined reference to 'xmlHasProp'
/opt/android-ndk-r9c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: /opt/Test6/bVNC/eclipse_projects/bVNC/obj/local/armeabi/objs/start-spice/start-spice.o: in function Java_com_iiordanov_bVNC_NativeCalls_getPortAndPassword:/opt/Test6/bVNC/eclipse_projects/bVNC/jni/src/start-spice.c:170: error: undefined reference to 'xmlHasProp'
/opt/android-ndk-r9c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: /opt/Test6/bVNC/eclipse_projects/bVNC/obj/local/armeabi/objs/start-spice/start-spice.o: in function Java_com_iiordanov_bVNC_NativeCalls_getPortAndPassword:/opt/Test6/bVNC/eclipse_projects/bVNC/jni/src/start-spice.c:172: error: undefined reference to 'xmlGetProp'
/opt/android-ndk-r9c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: /opt/Test6/bVNC/eclipse_projects/bVNC/obj/local/armeabi/objs/start-spice/start-spice.o: in function Java_com_iiordanov_bVNC_NativeCalls_getPortAndPassword:/opt/Test6/bVNC/eclipse_projects/bVNC/jni/src/start-spice.c:182: error: undefined reference to 'xmlHasProp'
/opt/android-ndk-r9c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: /opt/Test6/bVNC/eclipse_projects/bVNC/obj/local/armeabi/objs/start-spice/start-spice.o: in function Java_com_iiordanov_bVNC_NativeCalls_getPortAndPassword:/opt/Test6/bVNC/eclipse_projects/bVNC/jni/src/start-spice.c:184: error: undefined reference to 'xmlGetProp'
/opt/android-ndk-r9c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: /opt/Test6/bVNC/eclipse_projects/bVNC/obj/local/armeabi/objs/start-spice/start-spice.o: in function Java_com_iiordanov_bVNC_NativeCalls_getPortAndPassword:/opt/Test6/bVNC/eclipse_projects/bVNC/jni/src/start-spice.c:221: error: undefined reference to 'xmlFreeDoc'
/opt/android-ndk-r9c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: /opt/Test6/bVNC/eclipse_projects/bVNC/obj/local/armeabi/objs/start-spice/start-spice.o: in function Java_com_iiordanov_bVNC_NativeCalls_getPortAndPassword:/opt/Test6/bVNC/eclipse_projects/bVNC/jni/src/start-spice.c:234: error: undefined reference to 'xmlFreeDoc'
collect2: ld returned 1 exit status
make: *** [/opt/Test6/bVNC/eclipse_projects/bVNC/obj/local/armeabi/libstart-spice.so] Error 1
ะก code header in start-spice looks something like this:
#include <jni.h>
#include <android/log.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <libxml/parser.h>
#include <netdb.h>
#include <unistd.h>
#include <errno.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
And i in java code i add:
static
{
System.loadLibrary("start-spice");
}
Would be really really gratefull if someone helped!
If you have the prebuilt static library for Android in $(LOCAL_PATH)/libxml2/libxml2.a, you can use it as is in your spice-android project,
LOCAL_STATIC_LIBRARIES += xml2
Instead of include $(BUILD_SHARED_LIBRARY) for xml2, use
LOCAL_SRC_FILES := libxml2/libxml2.a
include $(PREBUILT_STATIC_LIBRARY)
If you have a strong reason to use xml2 as a separate shared library, you need to add call
System.loadLibrary("xml2");
to your Java code (before loading libspice-android.so) and replace LOCAL_SRC_FILES := $(LOCAL_PATH)/libxml2/libxml2.a with
LOCAL_WHOLE_STATIC_LIBRARIES := $(LOCAL_PATH)/libxml2/libxml2.a
This is issue of linking shared libraries, you need to add LOCAL_LDLIBS += $(LIB_PATH) -lxm2 just before LOCAL_SHARED_LIBRARIES= xml2 .
I have an image converter app on google play that runs fine and well, it incorporates NDK for support of more file formats using the DevIL Image Processing library.
It wokrs fine on most devices but since Android 4.4 Kitkat came out, i've received emails and crash reports on Google Play Console especially from Nexus devices that have 4.4 and now other older devices that receive the update
Here is the crash report
java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "png_set_longjmp_fn" referenced by "libdevil.so"...
at java.lang.Runtime.loadLibrary(Runtime.java:364)
at java.lang.System.loadLibrary(System.java:526)
at com.paul.icon.MainActivity.<clinit>(Unknown Source)
at java.lang.Class.newInstanceImpl(Native Method)
at java.lang.Class.newInstance(Class.java:1208)
at android.app.Instrumentation.newActivity(Instrumentation.java:1061)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2112)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
at android.app.ActivityThread.access$800(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
The app can't start and from my own debugging it's from the first lines of my MainActivity.java when loading libdevil
static {
System.loadLibrary("physfs");
System.loadLibrary("jpeg");
System.loadLibrary("tiff");
System.loadLibrary("mng");
System.loadLibrary("png");
System.loadLibrary("jasper");
System.loadLibrary("lcms");
System.loadLibrary("devil");
System.loadLibrary("mylib");
}
saying....
java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "png_set_longjmp_fn" referenced by "libdevil.so"...
here is my android.mk file
LOCAL_PATH := $(call my-dir)
PHYSFS_SRC_PATH := physfs-2.0.2/
TIFF_SRC_PATH := tiff-3.9.5/
MNG_SRC_PATH := libmng-1.0.10/
LCMS_SRC_PATH := lcms2-2.2/
PNG_SRC_PATH := libpng-1.5.6/
JPEG_SRC_PATH := jpeg-8c/
JASPER_SRC_PATH := jasper-1.900.1/
DEVIL_SRC_PATH := devil-1.7.8/
#libjpeg
include $(CLEAR_VARS)
LOCAL_MODULE := libjpeg
LOCAL_MODULE_FILENAME := libjpeg
LOCAL_SRC_FILES := \
${JPEG_SRC_PATH}jcapimin.c ${JPEG_SRC_PATH}jcapistd.c ${JPEG_SRC_PATH}jccoefct.c ${JPEG_SRC_PATH}jccolor.c ${JPEG_SRC_PATH}jcdctmgr.c ${JPEG_SRC_PATH}jchuff.c \
${JPEG_SRC_PATH}jcinit.c ${JPEG_SRC_PATH}jcmainct.c ${JPEG_SRC_PATH}jcmarker.c ${JPEG_SRC_PATH}jcmaster.c ${JPEG_SRC_PATH}jcomapi.c ${JPEG_SRC_PATH}jcparam.c \
${JPEG_SRC_PATH}jcprepct.c ${JPEG_SRC_PATH}jcsample.c ${JPEG_SRC_PATH}jctrans.c ${JPEG_SRC_PATH}jdapimin.c ${JPEG_SRC_PATH}jdapistd.c \
${JPEG_SRC_PATH}jdatadst.c ${JPEG_SRC_PATH}jdatasrc.c ${JPEG_SRC_PATH}jdcoefct.c ${JPEG_SRC_PATH}jdcolor.c ${JPEG_SRC_PATH}jddctmgr.c ${JPEG_SRC_PATH}jdhuff.c \
${JPEG_SRC_PATH}jdinput.c ${JPEG_SRC_PATH}jdmainct.c ${JPEG_SRC_PATH}jdmarker.c ${JPEG_SRC_PATH}jdmaster.c ${JPEG_SRC_PATH}jdmerge.c \
${JPEG_SRC_PATH}jdpostct.c ${JPEG_SRC_PATH}jdsample.c ${JPEG_SRC_PATH}jdtrans.c ${JPEG_SRC_PATH}jerror.c ${JPEG_SRC_PATH}jfdctflt.c ${JPEG_SRC_PATH}jfdctfst.c \
${JPEG_SRC_PATH}jfdctint.c ${JPEG_SRC_PATH}jidctflt.c ${JPEG_SRC_PATH}jidctfst.c ${JPEG_SRC_PATH}jidctint.c ${JPEG_SRC_PATH}jquant1.c \
${JPEG_SRC_PATH}jquant2.c ${JPEG_SRC_PATH}jutils.c ${JPEG_SRC_PATH}jmemmgr.c ${JPEG_SRC_PATH}jcarith.c ${JPEG_SRC_PATH}jdarith.c ${JPEG_SRC_PATH}jaricom.c
# Use the no backing store memory manager provided by
# libjpeg. See install.txt
LOCAL_SRC_FILES += \
${JPEG_SRC_PATH}jmemnobs.c
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)
include $(BUILD_STATIC_LIBRARY)
#libtiff
include $(CLEAR_VARS)
LOCAL_MODULE := libtiff
LOCAL_CFLAGS := -g -Dlinux -DFT2_BUILD_LIBRARY=1 -DPHYSFS_NO_CDROM_SUPPORT=1 -DAL_ALEXT_PROTOTYPES=1 -DHAVE_GCC_DESTRUCTOR=1 -DOPT_GENERIC -DREAL_IS_FLOAT
LOCAL_CPPFLAGS := ${LOCAL_CFLAGS}
LOCAL_C_INCLUDES := \
${TIFF_SRC_PATH}libtiff/ \
${JPEG_SRC_PATH} \
LOCAL_SRC_FILES := \
${TIFF_SRC_PATH}libtiff/tif_dir.c \
${TIFF_SRC_PATH}libtiff/tif_codec.c \
${TIFF_SRC_PATH}libtiff/tif_predict.c \
${TIFF_SRC_PATH}libtiff/tif_tile.c \
${TIFF_SRC_PATH}libtiff/tif_version.c \
${TIFF_SRC_PATH}libtiff/tif_unix.c \
${TIFF_SRC_PATH}libtiff/tif_swab.c \
${TIFF_SRC_PATH}libtiff/tif_thunder.c \
${TIFF_SRC_PATH}libtiff/tif_next.c \
${TIFF_SRC_PATH}libtiff/tif_strip.c \
${TIFF_SRC_PATH}libtiff/tif_extension.c \
${TIFF_SRC_PATH}libtiff/tif_error.c \
${TIFF_SRC_PATH}libtiff/tif_dirwrite.c \
${TIFF_SRC_PATH}libtiff/tif_fax3sm.c \
${TIFF_SRC_PATH}libtiff/tif_ojpeg.c \
${TIFF_SRC_PATH}libtiff/tif_flush.c \
${TIFF_SRC_PATH}libtiff/tif_warning.c \
${TIFF_SRC_PATH}libtiff/tif_fax3.c \
${TIFF_SRC_PATH}libtiff/tif_jbig.c \
${TIFF_SRC_PATH}libtiff/tif_open.c \
${TIFF_SRC_PATH}libtiff/tif_write.c \
${TIFF_SRC_PATH}libtiff/tif_packbits.c \
${TIFF_SRC_PATH}libtiff/tif_compress.c \
${TIFF_SRC_PATH}libtiff/tif_color.c \
${TIFF_SRC_PATH}libtiff/tif_print.c \
${TIFF_SRC_PATH}libtiff/tif_zip.c \
${TIFF_SRC_PATH}libtiff/tif_aux.c \
${TIFF_SRC_PATH}libtiff/tif_dumpmode.c \
${TIFF_SRC_PATH}libtiff/tif_dirread.c \
${TIFF_SRC_PATH}libtiff/tif_getimage.c \
${TIFF_SRC_PATH}libtiff/tif_jpeg.c \
${TIFF_SRC_PATH}libtiff/tif_close.c \
${TIFF_SRC_PATH}libtiff/tif_read.c \
${TIFF_SRC_PATH}libtiff/tif_luv.c \
${TIFF_SRC_PATH}libtiff/tif_dirinfo.c \
${TIFF_SRC_PATH}libtiff/tif_lzw.c \
${TIFF_SRC_PATH}libtiff/tif_pixarlog.c \
${TIFF_SRC_PATH}port/lfind.c
LOCAL_LDLIBS := -llog -L../lib -lGLESv1_CM
LOCAL_STATIC_LIBRARIES := libjpeg libphysfs
include $(BUILD_SHARED_LIBRARY)
#libphysfs
include $(CLEAR_VARS)
LOCAL_MODULE := libphysfs
LOCAL_CFLAGS := -g -Dlinux -Dunix -DFT2_BUILD_LIBRARY=1 -DPHYSFS_NO_CDROM_SUPPORT=1 -DAL_ALEXT_PROTOTYPES=1 -DHAVE_GCC_DESTRUCTOR=1 -DOPT_GENERIC -DREAL_IS_FLOAT \
-DPHYSFS_SUPPORTS_APK=1 -DPHYSFS_SUPPORTS_ZIP=1 -DPHYSFS_SUPPORTS_ZIP=1 -DPHYSFS_SUPPORTS_7Z=1 -DPHYSFS_SUPPORTS_GRP=1 -DPHYSFS_SUPPORTS_QPAK=1 -DPHYSFS_SUPPORTS_HOG=1 -DPHYSFS_SUPPORTS_MVL=1 -DPHYSFS_SUPPORTS_WAD=1
LOCAL_CPPFLAGS := ${LOCAL_CFLAGS}
LOCAL_C_INCLUDES := \
${PHYSFS_SRC_PATH}
LOCAL_SRC_FILES := \
${PHYSFS_SRC_PATH}/physfs.c \
${PHYSFS_SRC_PATH}/physfs_byteorder.c \
${PHYSFS_SRC_PATH}/physfs_unicode.c \
${PHYSFS_SRC_PATH}/platform/os2.c \
${PHYSFS_SRC_PATH}/platform/pocketpc.c \
${PHYSFS_SRC_PATH}/platform/posix.c \
${PHYSFS_SRC_PATH}/platform/unix.c \
${PHYSFS_SRC_PATH}/platform/macosx.c \
${PHYSFS_SRC_PATH}/platform/windows.c \
${PHYSFS_SRC_PATH}/archivers/dir.c \
${PHYSFS_SRC_PATH}/archivers/grp.c \
${PHYSFS_SRC_PATH}/archivers/hog.c \
${PHYSFS_SRC_PATH}/archivers/lzma.c \
${PHYSFS_SRC_PATH}/archivers/mvl.c \
${PHYSFS_SRC_PATH}/archivers/qpak.c \
${PHYSFS_SRC_PATH}/archivers/wad.c \
${PHYSFS_SRC_PATH}/archivers/zip.c \
${PHYSFS_SRC_PATH}/archivers/apk.c \
${PHYSFS_SRC_PATH}/lzma/C/7zCrc.c \
${PHYSFS_SRC_PATH}/lzma/C/Archive/7z/7zBuffer.c \
${PHYSFS_SRC_PATH}/lzma/C/Archive/7z/7zDecode.c \
${PHYSFS_SRC_PATH}/lzma/C/Archive/7z/7zExtract.c \
${PHYSFS_SRC_PATH}/lzma/C/Archive/7z/7zHeader.c \
${PHYSFS_SRC_PATH}/lzma/C/Archive/7z/7zIn.c \
${PHYSFS_SRC_PATH}/lzma/C/Archive/7z/7zItem.c \
${PHYSFS_SRC_PATH}/lzma/C/Archive/7z/7zMethodID.c \
${PHYSFS_SRC_PATH}/lzma/C/Compress/Branch/BranchX86.c \
${PHYSFS_SRC_PATH}/lzma/C/Compress/Branch/BranchX86_2.c \
${PHYSFS_SRC_PATH}/lzma/C/Compress/Lzma/LzmaDecode.c \
${PHYSFS_SRC_PATH}/zlib123/adler32.c \
${PHYSFS_SRC_PATH}/zlib123/compress.c \
${PHYSFS_SRC_PATH}/zlib123/crc32.c \
${PHYSFS_SRC_PATH}/zlib123/deflate.c \
${PHYSFS_SRC_PATH}/zlib123/gzio.c \
${PHYSFS_SRC_PATH}/zlib123/infback.c \
${PHYSFS_SRC_PATH}/zlib123/inffast.c \
${PHYSFS_SRC_PATH}/zlib123/inflate.c \
${PHYSFS_SRC_PATH}/zlib123/inftrees.c \
${PHYSFS_SRC_PATH}/zlib123/trees.c \
${PHYSFS_SRC_PATH}/zlib123/uncompr.c \
${PHYSFS_SRC_PATH}/zlib123/zutil.c \
LOCAL_LDLIBS := -llog -L../lib -lGLESv1_CM
LOCAL_STATIC_LIBRARIES :=
include $(BUILD_SHARED_LIBRARY)
#libmng
include $(CLEAR_VARS)
LOCAL_MODULE := libmng
LOCAL_CFLAGS := -g -Dlinux -DFT2_BUILD_LIBRARY=1 -DPHYSFS_NO_CDROM_SUPPORT=1 -DAL_ALEXT_PROTOTYPES=1 -DHAVE_GCC_DESTRUCTOR=1 -DOPT_GENERIC -DREAL_IS_FLOAT
LOCAL_CPPFLAGS := ${LOCAL_CFLAGS}
LOCAL_C_INCLUDES := \
${JPEG_SRC_PATH} \
${MNG_SRC_PATH}
LOCAL_SRC_FILES := \
${MNG_SRC_PATH}libmng_write.c \
${MNG_SRC_PATH}libmng_object_prc.c \
${MNG_SRC_PATH}libmng_display.c \
${MNG_SRC_PATH}libmng_chunk_xs.c \
${MNG_SRC_PATH}libmng_chunk_io.c \
${MNG_SRC_PATH}libmng_read.c \
${MNG_SRC_PATH}libmng_prop_xs.c \
${MNG_SRC_PATH}libmng_filter.c \
${MNG_SRC_PATH}libmng_chunk_descr.c \
${MNG_SRC_PATH}libmng_cms.c \
${MNG_SRC_PATH}libmng_zlib.c \
${MNG_SRC_PATH}libmng_pixels.c \
${MNG_SRC_PATH}libmng_error.c \
${MNG_SRC_PATH}libmng_trace.c \
${MNG_SRC_PATH}libmng_jpeg.c \
${MNG_SRC_PATH}libmng_callback_xs.c \
${MNG_SRC_PATH}libmng_dither.c \
${MNG_SRC_PATH}libmng_hlapi.c \
${MNG_SRC_PATH}libmng_chunk_prc.c \
LOCAL_LDLIBS := -llog -L../lib -lGLESv1_CM
LOCAL_STATIC_LIBRARIES := libjpeg libphysfs
include $(BUILD_SHARED_LIBRARY)
#liblcms
include $(CLEAR_VARS)
LOCAL_MODULE := liblcms
LOCAL_CFLAGS := -g -Dlinux -DFT2_BUILD_LIBRARY=1 -DPHYSFS_NO_CDROM_SUPPORT=1 -DAL_ALEXT_PROTOTYPES=1 -DHAVE_GCC_DESTRUCTOR=1 -DOPT_GENERIC -DREAL_IS_FLOAT
LOCAL_CPPFLAGS := ${LOCAL_CFLAGS}
LOCAL_C_INCLUDES := \
${LCMS_SRC_PATH}include/ \
LOCAL_SRC_FILES := \
${LCMS_SRC_PATH}src/cmscam02.c \
${LCMS_SRC_PATH}src/cmserr.c \
${LCMS_SRC_PATH}src/cmstypes.c \
${LCMS_SRC_PATH}src/cmsmd5.c \
${LCMS_SRC_PATH}src/cmswtpnt.c \
${LCMS_SRC_PATH}src/cmsgmt.c \
${LCMS_SRC_PATH}src/cmspcs.c \
${LCMS_SRC_PATH}src/cmsopt.c \
${LCMS_SRC_PATH}src/cmscnvrt.c \
${LCMS_SRC_PATH}src/cmsps2.c \
${LCMS_SRC_PATH}src/cmssamp.c \
${LCMS_SRC_PATH}src/cmsplugin.c \
${LCMS_SRC_PATH}src/cmsmtrx.c \
${LCMS_SRC_PATH}src/cmspack.c \
${LCMS_SRC_PATH}src/cmsio0.c \
${LCMS_SRC_PATH}src/cmsgamma.c \
${LCMS_SRC_PATH}src/cmscgats.c \
${LCMS_SRC_PATH}src/cmsxform.c \
${LCMS_SRC_PATH}src/cmsnamed.c \
${LCMS_SRC_PATH}src/cmssm.c \
${LCMS_SRC_PATH}src/cmsio1.c \
${LCMS_SRC_PATH}src/cmsintrp.c \
${LCMS_SRC_PATH}src/cmslut.c \
${LCMS_SRC_PATH}src/cmsvirt.c \
LOCAL_LDLIBS := -llog -L../lib -lGLESv1_CM
LOCAL_STATIC_LIBRARIES :=
include $(BUILD_SHARED_LIBRARY)
#libpng
include $(CLEAR_VARS)
LOCAL_MODULE := libpng
LOCAL_CFLAGS := -g -Dlinux -DFT2_BUILD_LIBRARY=1 -DPHYSFS_NO_CDROM_SUPPORT=1 -DAL_ALEXT_PROTOTYPES=1 -DHAVE_GCC_DESTRUCTOR=1 -DOPT_GENERIC -DREAL_IS_FLOAT
LOCAL_CPPFLAGS := ${LOCAL_CFLAGS}
LOCAL_C_INCLUDES := \
${PNG_SRC_PATH} \
LOCAL_SRC_FILES := \
${PNG_SRC_PATH}pngerror.c \
${PNG_SRC_PATH}pngwio.c \
${PNG_SRC_PATH}pngwrite.c \
${PNG_SRC_PATH}pngwutil.c \
${PNG_SRC_PATH}pngwtran.c \
${PNG_SRC_PATH}pngset.c \
${PNG_SRC_PATH}pngtrans.c \
${PNG_SRC_PATH}example.c \
${PNG_SRC_PATH}png.c \
${PNG_SRC_PATH}pngrtran.c \
${PNG_SRC_PATH}pngmem.c \
${PNG_SRC_PATH}pngpread.c \
${PNG_SRC_PATH}pngrutil.c \
${PNG_SRC_PATH}pngrio.c \
${PNG_SRC_PATH}pngget.c \
${PNG_SRC_PATH}pngread.c \
LOCAL_LDLIBS := -llog -L../lib -lGLESv1_CM
LOCAL_STATIC_LIBRARIES := libphysfs
include $(BUILD_SHARED_LIBRARY)
#libjasper
include $(CLEAR_VARS)
LOCAL_MODULE := libjasper
LOCAL_CFLAGS := -g -Dlinux -DFT2_BUILD_LIBRARY=1 -DPHYSFS_NO_CDROM_SUPPORT=1 -DAL_ALEXT_PROTOTYPES=1 -DHAVE_GCC_DESTRUCTOR=1 -DOPT_GENERIC -DREAL_IS_FLOAT
LOCAL_CPPFLAGS := ${LOCAL_CFLAGS}
LOCAL_C_INCLUDES := \
${JASPER_SRC_PATH}src/libjasper/include \
${JPEG_SRC_PATH} \
LOCAL_SRC_FILES := \
${JASPER_SRC_PATH}src/libjasper/base/jas_cm.c \
${JASPER_SRC_PATH}src/libjasper/base/jas_getopt.c \
${JASPER_SRC_PATH}src/libjasper/base/jas_seq.c \
${JASPER_SRC_PATH}src/libjasper/base/jas_malloc.c \
${JASPER_SRC_PATH}src/libjasper/base/jas_init.c \
${JASPER_SRC_PATH}src/libjasper/base/jas_debug.c \
${JASPER_SRC_PATH}src/libjasper/base/jas_stream.c \
${JASPER_SRC_PATH}src/libjasper/base/jas_string.c \
${JASPER_SRC_PATH}src/libjasper/base/jas_version.c \
${JASPER_SRC_PATH}src/libjasper/base/jas_tmr.c \
${JASPER_SRC_PATH}src/libjasper/base/jas_image.c \
${JASPER_SRC_PATH}src/libjasper/base/jas_tvp.c \
${JASPER_SRC_PATH}src/libjasper/base/jas_iccdata.c \
${JASPER_SRC_PATH}src/libjasper/base/jas_icc.c \
${JASPER_SRC_PATH}src/libjasper/jpc/jpc_mqcod.c \
${JASPER_SRC_PATH}src/libjasper/jpc/jpc_t1enc.c \
${JASPER_SRC_PATH}src/libjasper/jpc/jpc_dec.c \
${JASPER_SRC_PATH}src/libjasper/jpc/jpc_math.c \
${JASPER_SRC_PATH}src/libjasper/jpc/jpc_util.c \
${JASPER_SRC_PATH}src/libjasper/jpc/jpc_bs.c \
${JASPER_SRC_PATH}src/libjasper/jpc/jpc_tagtree.c \
${JASPER_SRC_PATH}src/libjasper/jpc/jpc_t1cod.c \
${JASPER_SRC_PATH}src/libjasper/jpc/jpc_t2enc.c \
${JASPER_SRC_PATH}src/libjasper/jpc/jpc_mqenc.c \
${JASPER_SRC_PATH}src/libjasper/jpc/jpc_enc.c \
${JASPER_SRC_PATH}src/libjasper/jpc/jpc_qmfb.c \
${JASPER_SRC_PATH}src/libjasper/jpc/jpc_t1dec.c \
${JASPER_SRC_PATH}src/libjasper/jpc/jpc_cs.c \
${JASPER_SRC_PATH}src/libjasper/jpc/jpc_t2cod.c \
${JASPER_SRC_PATH}src/libjasper/jpc/jpc_tsfb.c \
${JASPER_SRC_PATH}src/libjasper/jpc/jpc_mqdec.c \
${JASPER_SRC_PATH}src/libjasper/jpc/jpc_t2dec.c \
${JASPER_SRC_PATH}src/libjasper/jpc/jpc_mct.c \
${JASPER_SRC_PATH}src/libjasper/dummy.c \
${JASPER_SRC_PATH}src/libjasper/pnm/pnm_dec.c \
${JASPER_SRC_PATH}src/libjasper/pnm/pnm_enc.c \
${JASPER_SRC_PATH}src/libjasper/pnm/pnm_cod.c \
${JASPER_SRC_PATH}src/libjasper/jp2/jp2_enc.c \
${JASPER_SRC_PATH}src/libjasper/jp2/jp2_cod.c \
${JASPER_SRC_PATH}src/libjasper/jp2/jp2_dec.c \
${JASPER_SRC_PATH}src/libjasper/pgx/pgx_dec.c \
${JASPER_SRC_PATH}src/libjasper/pgx/pgx_enc.c \
${JASPER_SRC_PATH}src/libjasper/pgx/pgx_cod.c \
${JASPER_SRC_PATH}src/libjasper/bmp/bmp_enc.c \
${JASPER_SRC_PATH}src/libjasper/bmp/bmp_dec.c \
${JASPER_SRC_PATH}src/libjasper/bmp/bmp_cod.c \
${JASPER_SRC_PATH}src/libjasper/jpg/jpg_val.c \
${JASPER_SRC_PATH}src/libjasper/jpg/jpg_enc.c \
${JASPER_SRC_PATH}src/libjasper/jpg/jpg_dec.c \
${JASPER_SRC_PATH}src/libjasper/ras/ras_cod.c \
${JASPER_SRC_PATH}src/libjasper/ras/ras_dec.c \
${JASPER_SRC_PATH}src/libjasper/ras/ras_enc.c \
${JASPER_SRC_PATH}src/libjasper/mif/mif_cod.c \
LOCAL_LDLIBS := -llog -L../lib -lGLESv1_CM
LOCAL_STATIC_LIBRARIES := libjpeg
include $(BUILD_SHARED_LIBRARY)
#libdevil
include $(CLEAR_VARS)
LOCAL_MODULE := libdevil
LOCAL_CFLAGS := -g -Dlinux -DFT2_BUILD_LIBRARY=1 -DPHYSFS_NO_CDROM_SUPPORT=1 -DAL_ALEXT_PROTOTYPES=1 -DHAVE_GCC_DESTRUCTOR=1 -DOPT_GENERIC -DREAL_IS_FLOAT -fexceptions
LOCAL_CPPFLAGS := ${LOCAL_CFLAGS}
LOCAL_C_INCLUDES := \
${DEVIL_SRC_PATH}include \
${DEVIL_SRC_PATH}src-IL/include \
${DEVIL_SRC_PATH}src-ILU/include \
${JASPER_SRC_PATH}src/libjasper/include \
${PHYSFS_SRC_PATH} \
${PHYSFS_SRC_PATH}zlib123 \
${PNG_SRC_PATH} \
${MNG_SRC_PATH} \
${JPEG_SRC_PATH} \
${LCMS_SRC_PATH}include/ \
${TIFF_SRC_PATH}libtiff/ \
LOCAL_SRC_FILES := \
${DEVIL_SRC_PATH}src-IL/src/il_sun.c \
${DEVIL_SRC_PATH}src-IL/src/il_wdp.c \
${DEVIL_SRC_PATH}src-IL/src/il_doom.c \
${DEVIL_SRC_PATH}src-IL/src/il_jp2.c \
${DEVIL_SRC_PATH}src-IL/src/il_tpl.c \
${DEVIL_SRC_PATH}src-IL/src/il_size.c \
${DEVIL_SRC_PATH}src-IL/src/il_rle.c \
${DEVIL_SRC_PATH}src-IL/src/il_gif.c \
${DEVIL_SRC_PATH}src-IL/src/il_states.c \
${DEVIL_SRC_PATH}src-IL/src/il_psp.c \
${DEVIL_SRC_PATH}src-IL/src/il_devil.c \
${DEVIL_SRC_PATH}src-IL/src/il_convbuff.c \
${DEVIL_SRC_PATH}src-IL/src/il_ftx.c \
${DEVIL_SRC_PATH}src-IL/src/il_vtf.c \
${DEVIL_SRC_PATH}src-IL/src/il_iff.c \
${DEVIL_SRC_PATH}src-IL/src/il_lif.c \
${DEVIL_SRC_PATH}src-IL/src/il_pcx.c \
${DEVIL_SRC_PATH}src-IL/src/il_io.c \
${DEVIL_SRC_PATH}src-IL/src/il_files.c \
${DEVIL_SRC_PATH}src-IL/src/il_fastconv.c \
${DEVIL_SRC_PATH}src-IL/src/il_error.c \
${DEVIL_SRC_PATH}src-IL/src/il_main.c \
${DEVIL_SRC_PATH}src-IL/src/il_utx.cpp \
${DEVIL_SRC_PATH}src-IL/src/il_pcd.c \
${DEVIL_SRC_PATH}src-IL/src/il_neuquant.c \
${DEVIL_SRC_PATH}src-IL/src/il_dds.c \
${DEVIL_SRC_PATH}src-IL/src/il_dicom.c \
${DEVIL_SRC_PATH}src-IL/src/il_wal.c \
${DEVIL_SRC_PATH}src-IL/src/il_icon.c \
${DEVIL_SRC_PATH}src-IL/src/il_blp.c \
${DEVIL_SRC_PATH}src-IL/src/il_mp3.c \
${DEVIL_SRC_PATH}src-IL/src/il_header.c \
${DEVIL_SRC_PATH}src-IL/src/il_alloc.c \
${DEVIL_SRC_PATH}src-IL/src/il_sgi.c \
${DEVIL_SRC_PATH}src-IL/src/il_stack.c \
${DEVIL_SRC_PATH}src-IL/src/il_texture.c \
${DEVIL_SRC_PATH}src-IL/src/altivec_typeconversion.c \
${DEVIL_SRC_PATH}src-IL/src/il_targa.c \
${DEVIL_SRC_PATH}src-IL/src/il_bmp.c \
${DEVIL_SRC_PATH}src-IL/src/il_mdl.c \
${DEVIL_SRC_PATH}src-IL/src/il_pix.c \
${DEVIL_SRC_PATH}src-IL/src/il_pnm.c \
${DEVIL_SRC_PATH}src-IL/src/il_ilbm.c \
${DEVIL_SRC_PATH}src-IL/src/il_icns.c \
${DEVIL_SRC_PATH}src-IL/src/il_cut.c \
${DEVIL_SRC_PATH}src-IL/src/il_profiles.c \
${DEVIL_SRC_PATH}src-IL/src/il_hdr.c \
${DEVIL_SRC_PATH}src-IL/src/il_register.c \
${DEVIL_SRC_PATH}src-IL/src/il_exr.cpp \
${DEVIL_SRC_PATH}src-IL/src/il_iwi.c \
${DEVIL_SRC_PATH}src-IL/src/il_mng.c \
${DEVIL_SRC_PATH}src-IL/src/il_rot.c \
${DEVIL_SRC_PATH}src-IL/src/il_jpeg.c \
${DEVIL_SRC_PATH}src-IL/src/il_png.c \
${DEVIL_SRC_PATH}src-IL/src/il_pxr.c \
${DEVIL_SRC_PATH}src-IL/src/il_nvidia.cpp \
${DEVIL_SRC_PATH}src-IL/src/il_squish.cpp \
${DEVIL_SRC_PATH}src-IL/src/il_utility.c \
${DEVIL_SRC_PATH}src-IL/src/il_internal.c \
${DEVIL_SRC_PATH}src-IL/src/il_psd.c \
${DEVIL_SRC_PATH}src-IL/src/il_endian.c \
${DEVIL_SRC_PATH}src-IL/src/il_quantizer.c \
${DEVIL_SRC_PATH}src-IL/src/il_wbmp.c \
${DEVIL_SRC_PATH}src-IL/src/il_manip.c \
${DEVIL_SRC_PATH}src-IL/src/il_pic.c \
${DEVIL_SRC_PATH}src-IL/src/il_tiff.c \
${DEVIL_SRC_PATH}src-IL/src/il_pal.c \
${DEVIL_SRC_PATH}src-IL/src/il_dds-save.c \
${DEVIL_SRC_PATH}src-IL/src/il_raw.c \
${DEVIL_SRC_PATH}src-IL/src/il_convert.c \
${DEVIL_SRC_PATH}src-IL/src/il_dcx.c \
${DEVIL_SRC_PATH}src-IL/src/il_fits.c \
${DEVIL_SRC_PATH}src-IL/src/il_xpm.c \
${DEVIL_SRC_PATH}src-IL/src/il_bits.c \
${DEVIL_SRC_PATH}src-IL/src/altivec_common.c \
${DEVIL_SRC_PATH}src-IL/src/il_dpx.c \
${DEVIL_SRC_PATH}src-IL/src/il_rawdata.c \
${DEVIL_SRC_PATH}src-ILU/src/ilu_alloc.c \
${DEVIL_SRC_PATH}src-ILU/src/ilu_error.c \
${DEVIL_SRC_PATH}src-ILU/src/ilu_filter_rcg.c \
${DEVIL_SRC_PATH}src-ILU/src/ilu_filter.c \
${DEVIL_SRC_PATH}src-ILU/src/ilu_internal.c \
${DEVIL_SRC_PATH}src-ILU/src/ilu_main.c \
${DEVIL_SRC_PATH}src-ILU/src/ilu_manip.c \
${DEVIL_SRC_PATH}src-ILU/src/ilu_mipmap.c \
${DEVIL_SRC_PATH}src-ILU/src/ilu_noise.c \
${DEVIL_SRC_PATH}src-ILU/src/ilu_region.c \
${DEVIL_SRC_PATH}src-ILU/src/ilu_rotate.c \
${DEVIL_SRC_PATH}src-ILU/src/ilu_scale.c \
${DEVIL_SRC_PATH}src-ILU/src/ilu_scale2d.c \
${DEVIL_SRC_PATH}src-ILU/src/ilu_scale3d.c \
${DEVIL_SRC_PATH}src-ILU/src/ilu_scaling.c \
${DEVIL_SRC_PATH}src-ILU/src/ilu_states.c \
${DEVIL_SRC_PATH}src-ILU/src/ilu_utilities.c \
LOCAL_LDLIBS := -llog -L../lib -lGLESv1_CM -DFT2_BUILD_LIBRARY=1
LOCAL_STATIC_LIBRARIES := \
libjasper \
libpng \
libmng \
libjpeg \
liblcms \
libphysfs \
libtiff
include $(BUILD_SHARED_LIBRARY)
#mylib
include $(CLEAR_VARS)
LOCAL_MODULE := libmylib
LOCAL_CFLAGS := -g -Dlinux -DFT2_BUILD_LIBRARY=1 -DPHYSFS_NO_CDROM_SUPPORT=1 -DAL_ALEXT_PROTOTYPES=1 -DHAVE_GCC_DESTRUCTOR=1 -DOPT_GENERIC -DREAL_IS_FLOAT -fexceptions
LOCAL_CPPFLAGS := ${LOCAL_CFLAGS}
LOCAL_C_INCLUDES := \
${DEVIL_SRC_PATH}include \
${DEVIL_SRC_PATH}src-IL/include \
${DEVIL_SRC_PATH}src-ILU/include \
${JASPER_SRC_PATH}src/libjasper/include \
${PHYSFS_SRC_PATH} \
${PHYSFS_SRC_PATH}zlib123 \
${PNG_SRC_PATH} \
${MNG_SRC_PATH} \
${JPEG_SRC_PATH} \
${LCMS_SRC_PATH}include/ \
${TIFF_SRC_PATH}libtiff/ \
LOCAL_SRC_FILES := native.cpp
LOCAL_LDLIBS := -llog -lGLESv2
LOCAL_STATIC_LIBRARIES := \
libjasper \
libpng \
libmng \
libjpeg \
liblcms \
libphysfs \
libtiff \
libdevil \
include $(BUILD_SHARED_LIBRARY)
and my application.mk
APP_STL := gnustl_static
APP_ABI := armeabi-v7a
after searching my entire jni folder for the png_set_longjmp_fn string, i found it in the following files in my libpng folder. Below are snippets.
pngerror.c
#ifdef PNG_SETJMP_SUPPORTED
/* This API only exists if ANSI-C style error handling is used,
* otherwise it is necessary for png_default_error to be overridden.
*/
jmp_buf* PNGAPI
png_set_longjmp_fn(png_structrp png_ptr, png_longjmp_ptr longjmp_fn,
size_t jmp_buf_size)
{
/* From libpng 1.6.0 the app gets one chance to set a 'jmpbuf_size' value
* and it must not change after that. Libpng doesn't care how big the
* buffer is, just that it doesn't change.
*
* If the buffer size is no *larger* than the size of jmp_buf when libpng is
symbols.def
;Version 1.6.2
;--------------------------------------------------------------
; LIBPNG symbol list as a Win32 DEF file
; Contains all the symbols that can be exported from libpng
;--------------------------------------------------------------
LIBRARY
EXPORTS
png_access_version_number #1
png_set_sig_bytes #2
png_sig_cmp #3
png_create_read_struct #4
png_create_write_struct #5
png_get_compression_buffer_size #6
png_set_compression_buffer_size #7
png_set_longjmp_fn #8
png_longjmp #9
png.h
#ifdef PNG_SETJMP_SUPPORTED
/* This function returns the jmp_buf built in to *png_ptr. It must be
* supplied with an appropriate 'longjmp' function to use on that jmp_buf
* unless the default error function is overridden in which case NULL is
* acceptable. The size of the jmp_buf is checked against the actual size
* allocated by the library - the call will return NULL on a mismatch
* indicating an ABI mismatch.
*/
PNG_EXPORT(8, jmp_buf*, png_set_longjmp_fn, (png_structrp png_ptr,
png_longjmp_ptr longjmp_fn, size_t jmp_buf_size));
# define png_jmpbuf(png_ptr) \
(*png_set_longjmp_fn((png_ptr), longjmp, (sizeof (jmp_buf))))
#else
Any help to make kitkat locate it is much appreciated.
Well from all my googling, I think Android 4.4 tries to link anything called libpng to its own libpng 1.2.46, My libpng 1.5.6 had the png_set_longjmp_fn symbols and the one 4.4 uses doesn't
So i went to my android.mk file and renamed libpng to libpngo as well as the system.load thingy in my mainactivity.
Works OK now.
The project https://github.com/iiordanov/bVNC using gstreamer sdk(http://docs.gstreamer.com/display/GstSDK/Installing+for+Android+development).
the jpeg library used by it is jpeglib.
I want to replace jpeglib with libjpeg-turbo to improve mjpeg decoding performance. How can I do it?
1, I changed the Android.mk file in jni/src. Below is the changed version. I haven't replaced the jpeglib used by gstreamer, but replaced the jpeglib used by aSPICE. The bVNC code I am using is v3.3.5.
2, When compiling libjpeg-turbo 1.3.0, make sure you configure it with --with-jpeg8.
3, Below is the modified Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LIB_PATH := $(LOCAL_PATH)/../../libs/armeabi
SPICE_CLIENT_ANDROID_DEPS := $(LOCAL_PATH)/../libs/deps
CROSS_DIR := /opt/android
spice_objs := \
$(SPICE_CLIENT_ANDROID_DEPS)/lib/libssl.a \
$(SPICE_CLIENT_ANDROID_DEPS)/lib/libcrypto.a \
$(CROSS_DIR)/lib/libturbojpeg.a \
$(SPICE_CLIENT_ANDROID_DEPS)/lib/libcelt051.a
LOCAL_MODULE := spice
LOCAL_SRC_FILES := channel-record.c channel-playback.c channel-cursor.c \
spice-cmdline.c coroutine_gthread.c spice-util.c \
spice-session.c spice-channel.c spice-marshal.c spice-glib-enums.c \
common/generated_client_demarshallers.c common/generated_client_demarshallers1.c \
common/generated_client_marshallers.c common/generated_client_marshallers1.c \
gio-coroutine.c channel-base.c channel-main.c spice-proxy.c bio-gsocket.c glib-compat.c \
channel-display.c channel-display-mjpeg.c channel-inputs.c decode-glz.c \
decode-jpeg.c decode-zlib.c wocky-http-proxy.c channel-port.c spice-client.c spice-audio.c \
common/mem.c common/marshaller.c common/canvas_utils.c common/backtrace.c \
common/sw_canvas.c common/pixman_utils.c common/lines.c common/rop3.c common/quic.c \
common/lz.c common/region.c common/ssl_verify.c common/log.c spice-gstaudio.c
LOCAL_LDLIBS += $(spice_objs) \
-ljnigraphics -llog -ldl -lstdc++ -lz -lc \
-malign-double -malign-loops
LOCAL_LDLIBS += -L$(LIB_PATH) -lgstreamer_android
LOCAL_CPPFLAGS += -DG_LOG_DOMAIN=\"GSpice\" \
-DSW_CANVAS_CACHE \
-DSPICE_GTK_LOCALEDIR=\"/usr/local/share/locale\" \
-DHAVE_CONFIG_H -UHAVE_SYS_SHM_H -DSW_CANVAS_CACHE \
-D_REENTRANT -DWITH_GSTAUDIO
LOCAL_C_INCLUDES += $(LOCAL_PATH)/common \
$(SPICE_CLIENT_ANDROID_DEPS)/include
LOCAL_CFLAGS := $(LOCAL_CPPFLAGS) \
-std=gnu99 -Wall -Wno-sign-compare -Wno-deprecated-declarations -Wl,--no-undefined \
-fPIC -DPIC -O3 -funroll-loops -ffast-math
LOCAL_EXPORT_CFLAGS += $(LOCAL_CFLAGS)
LOCAL_EXPORT_LDLIBS += $(LOCAL_LDLIBS)
LOCAL_SHARED_LIBRARIES := gstreamer_android
LOCAL_ARM_MODE := arm
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := spice-android
LOCAL_SRC_FILES := android/android-service.c android/android-spicy.c android/android-spice-widget.c \
android/android-io.c
LOCAL_STATIC_LIBRARIES := spice
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
ifndef GSTREAMER_SDK_ROOT
ifndef GSTREAMER_SDK_ROOT_ANDROID
$(error GSTREAMER_SDK_ROOT_ANDROID is not defined!)
endif
GSTREAMER_SDK_ROOT := $(GSTREAMER_SDK_ROOT_ANDROID)
endif
GSTREAMER_NDK_BUILD_PATH := $(GSTREAMER_SDK_ROOT)/share/gst-android/ndk-build/
include $(GSTREAMER_NDK_BUILD_PATH)/plugins.mk
GSTREAMER_PLUGINS := $(GSTREAMER_PLUGINS_CORE) $(GSTREAMER_PLUGINS_SYS)
GSTREAMER_EXTRA_DEPS := glib-2.0 gthread-2.0 pixman-1 gstreamer-app-0.10
include $(GSTREAMER_NDK_BUILD_PATH)/gstreamer.mk