在做android开发中,经常会用到第三方的so库,而这些库的代码是保密的,只提供.h头文件给你调用.
因不懂makefile,所有走了很多弯路。在此记录下,这种用法。
在这里假设别人提供了 abc.so 和 def.so库这2个已经编译好的库文件,和abc.h头文件。
首先,在eclipse里面项目中新建一个jni文件夹,再建一个子文件夹:prebuilt
把abc.so和def.so复制进prebuilt文件夹中。
然后,在prebuilt文件中,新建Android.mk文件,这个文件会在编译时,自动复制到obj/local/armeabi/目录下,内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := abc
LOCAL_SRC_FILES := abc.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := svnssl
LOCAL_SRC_FILES := libsvnssl.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := def
LOCAL_SRC_FILES := def.so
include $(PREBUILT_SHARED_LIBRARY)
再之后,便是在jni目录下,编写代码,引用abc.h这个头文件,实现需求的功能模块。这里假设实现代码为ffabc.c
接着在jni目录下,编写Android.mk文件,以实现编译,内容如下:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
ffabc.c
LOCAL_MODULE:=ffabc
LOCAL_SHARED_LIBRARIES += abc
LOCAL_SHARED_LIBRARIES += def
LOCAL_LDLIBS+=-llog
include $(BUILD_SHARED_LIBRARY)
include $(LOCAL_PATH)/prebuilt/Android.mk
接着,编译后,便可以在libs/armeabi/目录下看到libabc.so,libdef.so和libffabc.so这三个文件了。
至于怎么用,就不啰嗦了。网上大把大把的教程,搜索jni就有。