一个maven的典型目录结构:
src/main/java
src/main/resources
src/test/java
src/test/resources
根据含义src代码源码库, main代表主代码 test表示测试代码。java表示java部分。
那么如果再加上C语言部分,那目录可以这样安排
src/main/java
src/main/c — c语言部分
src/test/java
src/test/c — c语言测试代码
src/test/resources
include —引用的其它c语言头文件
lib —引用的其它动态链接库
使用maven编译c语言,还是要用插件:
<dependency> <groupId>org.fusesource.hawtjni</groupId> <artifactId>maven-hawtjni-plugin</artifactId> <version>1.13</version> </dependency> |
这个插件会帮你生成一个c语言工程(主要是configure文件和makefile文件),并帮你编译成so文件,并放到jar包的指定目录下,非常好用。
示例配置如下:
<build> <plugins> <plugin> <groupId>org.fusesource.hawtjni</groupId> <artifactId>maven-hawtjni-plugin</artifactId> <version>1.10</version> <executions> <execution> <id>build-linux64</id> <configuration> <name>${project.artifactId}</name> <buildDirectory>${project.build.directory}/linux64</buildDirectory> <nativeSourceDirectory>${basedir}/src/main/c</nativeSourceDirectory> <libDirectory>${basedir}/target/classes/</libDirectory> <configureArgs> <arg>--with-arch=x86_64</arg> <arg>CFLAGS=-I${basedir}/include</arg> <arg>LDFLAGS=-L${basedir}/lib</arg> <arg>LIBS=-lXXXX</arg> </configureArgs> <platform>linux64</platform> <forceConfigure>true</forceConfigure> <forceAutogen>true</forceAutogen> </configuration> <goals> <goal>generate</goal> <goal>build</goal> </goals> <phase>compile</phase> </execution> </executions> </plugin> </plugins> </build> |
configureArgs 里包含了makefile需要的参数,其中XXXX表示你依赖的库名,也可以加上更多你需要的其它的参数。
假设你的工程名叫hello。执行mvn clean package 之后
maven会帮你在你的target/native-build目录下生成一个c语言工程,并执行相应操作系统的编译。
就比如上面的linux64位系统,最终会生成一个libhello.so文件到你的jar包的META-INF/native/linux64/ 目录下
你可以用各种手段使用System.loadLibrary加载它。
下一篇学习java和c语言之间的参数传递和方法调用。
除非注明,赵岩的博客文章均为原创,转载请以链接形式标明本文地址
本文地址:https://zhaoyanblog.com/archives/935.html