您的位置:首页 > 移动开发 > Android开发

Android Studio cmake方式jni开发,在c层使用其它动态链接库*.so

2016-11-16 01:30 627 查看
最近在研究Google推荐的cmake方式的ndk开发,遍寻网络居然很难找到如何在c层调用其它动态链接库函数(cmake方式),经过不懈努力,终于找到了可行的方法;本人初次涉及ndk开发,如有失误之处,请指教;
本文完整项目:


http://download.csdn.net/detail/qq372848728/9684002

忘记清理编译文件了,占用空间可能有点大;

本文主要介绍如何通过编译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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息