你是不是觉得要去了解Swig命令,还要去了解CMake是什么,不知道CMakeLists文件怎么写。这么多步骤好烦杂啊,这篇文章我会介绍更简单的方法,什么都不需要干,只需要编译一下什么都有了。这篇文章通过把Swig的命令全部集成到Cmake中来,通过编写CMakeLists文件编译即可生成一切你需要的。
一、说明
其实就是Cmake官网支持Swig的封装,也就是把Swig的一系列操作通过Cmake封装到CMakeLists文件中在,在这里面就行一切操作
二、代码
这是我找了好多资料才写好的,因为我的上司说上面方法步骤太多了,于是,逼出最强的我,我就写了这个。只需要修改你生成的Java接口的文件路径和你的so库的名称即可。代码如下
--CMakeLists.txt
#指定CMake的最小版本
cmake_minimum_required(VERSION 3.4.1)
#需要修改的地方
#1.指定Swig生成的java接口的包名,修改"com.geo.earthworklib"即可,生成的位置在app/src/main/java目录下面
set(JAVA_GEN_PACKAGE "com.cjh.hello")
#2.指定最终生成的.so的名称
set(LAST_SO_NAME "hello")
#寻找安装好的swig,其实就是去电脑中找你安装好的Swig环境,所以我们需要提前安装环境。
find_package(SWIG REQUIRED)
include(${SWIG_USE_FILE})
#这是Swing的命令,其实下面操作就是把这个命令封装到Cmake中
#swig.exe -c++ -java -package com.cjh.hello-outdir F:/AllProjects/EarthworkLib/app/src/main/java/com/cjh/hello-o Unix_wrap.cxx Unix.i
string(REPLACE "." "/" JAVA_GEN_SUBDIR ${JAVA_GEN_PACKAGE})
set(JAVA_GEN_DIR ${Project_SOURCE_DIR}/src/main/java/${JAVA_GEN_SUBDIR})
set(SOURCE_GEN_DIR ${Project_SOURCE_DIR}/src/main/cpp)
#JAVA文件输出目录 -outdir
set(CMAKE_SWIG_OUTDIR ${JAVA_GEN_DIR})
#指定一个输出目录名,用于放置生成的源文件。例如输出的UnixJAVA_wrap.cxx文件等的位置
set(SWIG_OUTFILE_DIR ${SOURCE_GEN_DIR})
#指定包名 -package
set(CMAKE_SWIG_FLAGS -c++ -package ${JAVA_GEN_PACKAGE} )
#c ++模式
set_property(SOURCE src/main/cpp/Unix.i PROPERTY CPLUSPLUS ON)
#开始生成
swig_add_library(swig LANGUAGE java SOURCES src/main/cpp/Unix.i)
#这里其实也会生成一个libswig.so的库,只不过我不需要所以没保存
#设置生成的so动态库最后输出的路径
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/libs/${ANDROID_ABI})
#创建一个静态或者动态库,并提供其关联的源文件路径,开发者可以定义多个库,
#CMake会自动去构建它们。Gradle可以自动将它们打包进APK中。
#第一个参数——LAST_SO_NAME:是库的名称
#第二个参数——SHARED:是库的类别,是动态的还是静态的
#第三个参数——src/main/cpp/UnixJAVA_wrap.cxx:是库的源文件的路径
add_library(${LAST_SO_NAME} SHARED src/main/cpp/UnixJAVA_wrap.cxx )
三.总结
文章虽短,但都是精华,资料很难找啊,太难了,我真的太难了,但能给你们帮助我就开心,哈哈哈,你们知道该干嘛?
参考资料:
https://cmake.org/cmake/help/latest/module/UseSWIG.html