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

9 篇文章 0 订阅
5 篇文章 0 订阅
最近在研究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。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Studio使用 Gradle 构建工具进行编译和打包,生成 .so 动态链接库,可以按照以下步骤进行: 1. 在 Android Studio 中创建一个 C/C++ 模块,选择 File -> New -> New Module -> C/C++ Library,然后按照向导设置模块名称、语言类型和支持的 ABI。 2. 在模块的 build.gradle 文件中,添加以下配置: ```groovy android { // 指定支持的 ABI,包括 armeabi-v7a、arm64-v8a、x86、x86_64 等 ndk { abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' } // 配置 CMakeLists.txt 文件路径 externalNativeBuild { cmake { path "CMakeLists.txt" } } } // 配置 CMake 版本 cmake { version "3.10.2" } ``` 3. 在模块的 src/main 目录下创建 jni 文件夹,并将 C/C++ 代码放入该文件夹中。 4. 在 jni 文件夹下创建 CMakeLists.txt 文件,并编写编译选项和链接选项,指定生成 .so 文件的名称和路径,以及引入其他依赖库等。例如: ```cmake # 设置编译选项 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") # 设置源文件路径 file(GLOB_RECURSE SOURCE_FILES "*.cpp") # 设置头文件路径 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) # 配置动态库输出路径和名称 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}) set(CMAKE_LIBRARY_OUTPUT_NAME "native-lib") # 引入其他依赖库 find_library(log-lib log) # 生成动态库 add_library(native-lib SHARED ${SOURCE_FILES}) target_link_libraries(native-lib ${log-lib}) ``` 5. 点击 Android Studio 工具栏中的 Build -> Make Project,进行编译和打包,生成 .so 动态链接库。 6. 在模块的 build.gradle 文件中查看生成的 .so 文件路径,例如: ```groovy android { externalNativeBuild { cmake { path "CMakeLists.txt" } } sourceSets { main { jniLibs.srcDirs = ['src/main/jniLibs'] } } } ``` 以上就是在 Android Studio使用 Gradle 构建工具进行编译和打包,生成 .so 动态链接库的步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值