天天看點

寫android.mk的常見錯誤

最近在研究如何在android上寫c代碼,對ndk有一些體會,列出一些困擾我多時的問題,以便以後注意

假設我将所有的.h .cpp檔案都放入jni下一個叫algorithm的檔案夾

(1)在jni下需要寫兩個檔案:Android.mk和XXX.cpp

後一個可以通過類似于javah -jni com.jwj.Core(包名+類名)來生成,生成後是個.h檔案,實作裡面的函數,并将其改為諸如interface.cpp

前一個的内容諸如:

TOP_LOCAL_PATH := $(call my-dir)

include $(call all-subdir-makefiles)

LOCAL_PATH := $(TOP_LOCAL_PATH)

include $(CLEAR_VARS)

LOCAL_MODULE := core

LOCAL_C_INCLUDES := /home/jwj/software/OpenCV_245/sdk/native/jni/include

LOCAL_SRC_FILES := interface.cpp

LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog -lz

LOCAL_STATIC_LIBRARIES = algorithm

include $(BUILD_SHARED_LIBRARY)

第二行容易漏,它是說要便利子目錄下的Android.mk檔案,不加的話,會報:

LOCAL_C_INCLUDES是訓示opencv的目錄在哪,所有Android.mk檔案都要加,否則會報:

opencv2/core/core.hpp: No such file or directory

LOCAL_LDLIBS是為了加上漏掉的兩個庫log和zip,否則會報:

error: undefined reference to 'gzclose'

error: undefined reference to 'gzeof'

等錯誤。

注意algorithm是我們現在需要用到的靜态庫,之後會編入成名為core的動态庫

(2)algorithm檔案夾中的android.mk

剛才說的那個algorithm是如何編譯出的呢?也是通過一個android.mk編譯的。

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

OPENCV_LIB_TYPE:=STATIC

include /home/jwj/software/OpenCV_245/sdk/native/jni/OpenCV.mk

LOCAL_MODULE    := algorithm

LOCAL_C_INCLUDES := /home/jwj/software/OpenCV_245/sdk/native/jni/include

LOCAL_SRC_FILES := Core.cpp\

init.cpp\

FaceProcess.cpp\

include $(BUILD_STATIC_LIBRARY)

為什麼這裡隻是指定了.cpp的路徑?因為.h檔案預設會到目前目錄下找了。

很容易看出,這個makefile的功能是編譯出一個名為algorithm的靜态庫