最近在研究Google推荐的cmake方式的ndk开发,遍寻网络居然很难找到如何在c层调用其它动态链接库函数(cmake方式),经过不懈努力,终于找到了可行的方法;本人初次涉及ndk开发,如有失误之处,请指教;
本文完整项目:
忘记清理编译文件了,占用空间可能有点大;
本文主要介绍如何通过编译libjpeg动态链接库,然后再如何访问libjpeg的库函数;
首先当然是创建cmake方式的Android Studio project,
注意勾选Include c++选项,该选项会自动创建cmake配置文件以及cpp文件夹,当然,如果熟悉cmake也将普通工程转为cmake方式的project,后面的选项默认即可,直接next;
项目创建完成之后注意:
这里的group最好选择Project,方便后面修改cmake配置文件;
项目创建完成之后,需要导入要用到的so文件libjpeg.so,这里我已经提前通过ndk编译好了,如下图放置到libs文件夹即可,然后将libjpeg.so源码里的.h文件放到cpp目录下,
然后修改Module下build.gradle文件在android节点下加入以下配置
sourceSets {
main {
jniLibs.srcDirs = [‘libs’]
}
}
sync一下即可,当然如果没有编译好的libjpeg.so,可按照如下方式编译(需要预先配置好ndk开发环境,具体度娘),首先下载libjpeg源码,去http://www.ijg.org/下载.zip格式的,解压,然后在解压后的文件夹里新建jni文件夹,然后将libjpeg的所有文件移动到jni文件夹里,如图
现在还需要在上一步的jni文件夹里新建Android.mk文件,mk文件内容如下:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_ARM_MODE := arm
LOCAL_SRC_FILES :=jaricom.c jcapimin.c jcapistd.c jcarith.c jccoefct.c jccolor.c \
jcdctmgr.c jchuff.c jcinit.c jcmainct.c jcmarker.c jcmaster.c \
jcomapi.c jcparam.c jcprepct.c jcsample.c jctrans.c jdapimin.c \
jdapistd.c jdarith.c jdatadst.c jdatasrc.c jdcoefct.c jdcolor.c \
jddctmgr.c jdhuff.c jdinput.c jdmainct.c jdmarker.c jdmaster.c \
jdmerge.c jdpostct.c jdsample.c jdtrans.c jerror.c jfdctflt.c \
jfdctfst.c jfdctint.c jidctflt.c jidctfst.c jidctint.c jquant1.c \
jquant2.c jutils.c jmemmgr.c jmemnobs.c
LOCAL_C_INCLUDES := $(LOCAL_PATH)
LOCAL_CFLAGS += -O3 -fstrict-aliasing -fprefetch-loop-arrays \
-DANDROID -DANDROID_TILE_BASED_DECODE -DENABLE_ANDROID_NULL_CONVERT
LOCAL_MODULE := libjpeg
LOCAL_MODULE_TAGS := optional
# unbundled branch, built against NDK.
LOCAL_SDK_VERSION := 17
include $(BUILD_SHARED_LIBRARY)
最后打开jni文件夹的上级目录,按住shift+鼠标右键,
选择在此处打开命令窗口,然后输入ndk-build 回车(如果没有配置ndk开发环境,此命令无效)
,即可编译出libjpeg.so文件;
重头戏来啦,由于需要使用libjpeg的库函数,所以需要该库的头文件
如图放置即可
如果此时你去调用libjpeg的库函数,你就会发现用不了,只是为什么呢?是因为没有修改cmake的配置文件,打开项目内的CMakeLists.txt文件,添加如下信息
add_library( libjpeg SHARED IMPORTED )
set_target_properties(libjpeg PROPERTIES IMPORTED_LOCATION
D:/Android/WorkSpaseForAS/TestLibjpeg/libjpeg/libs/${ANDROID_ABI}/libjpeg.so)
并修改target_link_libraries成如下配置
target_link_libraries( # Specifies the target library.
native-lib
# Links the target library to the log library
# included in the NDK.
${log-lib}
libjpeg)
这里就可以在native-lib.cpp里使用libjpeg了,
当然还需要include 头文件:
extern "C" {
#include "setjmp.h"
#include "jpeglib.h"
#include "jconfig.h"
#include "cdjpeg.h"
}
嗯,先到这里了,下一次可能会讲如何将libjpeg解码的bmp数据生成Android 的Bitmap然后显示到屏幕上,也是在本文的基础上,通过c层调用libjpeg.so。