NDK編譯C++庫,

折騰了一天, 終於把編譯問題解決了。

之前使用JNI編譯C語言是很隨意就過了, 本以爲C++也是一樣輕鬆, 沒想到上來就被打臉  抓狂

用#include <iostream>這個頭文件, 提示文件不存在, 用find找了一下, 是存在的。後來我把.c改成了.cpp之後, 可以編譯通過了。

但是原來的項目是C語言的, 還得想辦法用C語言調用C++及C++的第三方庫。

我就用C++封裝幾個C語言的接口。可 參見:C調用C++

當調用第三方的函數時, 又報了一大堆錯誤, 錯誤大致如下:error: undefined reference to 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >::assign(char const*)'     

接着google吧。 在http://stackoverflow.com/questions/11665521/ndk-ndk-build-error 這個網址上參考了2樓及3樓。 

嗯, 有效果, 雖然還是沒有通過, 但是編譯的錯誤卻變成了undefined reference to 'wcstombs'。

又找到了http://bbs.csdn.net/topics/390793521?page=1#post-398836843這個帖子。 錯誤一模一樣, 仔細一看, 都是在用udx,偷笑

讓我換64位的機器? 感覺不太靠譜, 接着試吧。

https://groups.google.com/forum/#!msg/android-opencv/MR0iKfsMWYA/rtq2h5Gh8IcJ (貌似得翻牆), 上面說平臺的版本不夠高。然後我把jni目錄下的Application.mk文件, 改成了如下:

<pre name="code" class="cpp">APP_OPTIM := release
APP_PLATFORM := android-8
APP_STL := gnustl_static
APP_CPPFLAGS += -frtti
APP_CPPFLAGS += -fexceptions
APP_CPPFLAGS += -DANDROID
APP_ABI := armeabi-v7a

 

問題解決!

但是我怕指定APP_PLATFORM版本, 在其它android機器上會有影響, 所以去掉APP_PLATFORM試了一下, 嗯, 還是不行, 但去掉APP_ABI是可以的。 至此編譯問題總算解決了。

Application.mk:

<pre name="code" class="cpp">APP_OPTIM := release
APP_PLATFORM := android-8
APP_STL := gnustl_static
APP_CPPFLAGS += -frtti
APP_CPPFLAGS += -fexceptions
APP_CPPFLAGS += -DANDROID
#APP_ABI := armeabi-v7a

Android.mk:

<pre name="code" class="cpp">LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := com_example_yan_HelloJNI
LOCAL_SRC_FILES := com_example_yan_HelloJNI.c \
    udx_c.cpp

LOCAL_JNI_SHARED_LIBRARIES :=libcom_example_yan_HelloJNI
#LOCAL_LDLIBS := -L/home/dyjun/test/android/jni -lffmpeg
LOCAL_LDLIBS := -L/home/dyjun/jni_udx_test/android/jni/lib/ -lStreamMediaLib -lfudx
LOCAL_WHOLE_STATIC_LIBRARIES := libgnustl_static

#LOCAL_LDLIBS := -L./jni/lib/ -lfudx -lStreamMediaLib

include $(BUILD_SHARED_LIBRARY)




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章