JAVA简单调用C/C++语言(JNI学习二)

一个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语言之间的参数传递和方法调用。

留言

提示:你的email不会被公布,欢迎留言^_^

*

验证码 *