天天看点

写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的静态库