最近在研究如何在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的静态库