使用native方法调用C程序

本文介绍如何在Java程序中调用C语言编写的DLL库,包括配置环境变量、编写Java调用代码、创建C语言源文件、编译生成DLL及调用流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     最近项目中需要对程序中一部分代码进行优化,所以要将一部分功能用C语言实现,这就涉及到java和C的交互。

     今天做了一个小demo,主要用C语言实现了一个累加功能,java调用C生成的dll库。

运行环境:Win7+ Eclipse Version: Helios + MinGW1.5.6

 

(1)安装MinGW,配置环境变量。

    右击我的电脑,点属性->高级->环境变量。
1、在PATH里加入C:\MinGW\bin(MinGW的安装目录)
2、新建LIBRARY_PATH变量,在值中加入C:\MinGW\lib,这是标准库的位置。
3、新建C_INCLUDEDE_PATH变量,值设为C:\MinGW\include。
4、新建CPLUS_INCLUDE_PATH变量,值为C:\MinGW\include\c++\3.4.5;C:\MinGW\include\c++\3.4.5;

C:\MinGW\include\c++\3.4.5\backward;C:\MinGW\include


(2)编写CallTest.java文件

 

public class CallTest {

	static {
		System.loadLibrary("plus");
	}
	
	public static native int getPlusAnswer(int x);
	
	public static void main(String...args){
		System.out.println("answer of 10="+getPlusAnswer(100));
	}
}

 进入到工程项目的bin目录,使用javah CallTest命令,生成CallTest.h文件。

如下所示:

 

/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class CallTest */

#ifndef _Included_CallTest
#define _Included_CallTest
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     CallTest
 * Method:    getPlusAnswer
 * Signature: (I)I
 */
JNIEXPORT jint JNICALL Java_CallTest_getPlusAnswer
  (JNIEnv *, jclass, jint);

#ifdef __cplusplus
}
#endif
#endif

 其中Java_CallTest_getPlusAnswer是我们关心的方法,这便是后面要具体实现的方法。


(3)编写plus.c实现功能,该源文件引用(2)中的头文件。

 

#include <stdio.h>
#include "CallTest.h"
#include "jni.h"

int n=0;
int j=0;
int answer=0;

JNIEXPORT jint JNICALL Java_CallTest_getPlusAnswer
  (JNIEnv *env, jclass class, jint x){
	n=x;
	for(j=1;j<=n;j++)
		answer+=j;
	return answer;
}

 

(4)好了,接下来编译plus.c文件生成plus.o

进入文件的目录,使用命令

 

 gcc -c -I"C:\Program Files\Java\jdk1.6.0_10\include" -I"C:\Program Files\Java\jdk1.6.0_10\include\win32" -o plus.o plus.c

 这里两个引号是jdk安装目录下的一些c头文件的目录

 

(5)新建plus.def文件,用于生成dll

plus.def文件内容如下

 

EXPORTS
Java_CallTest_getPlusAnswer

 第二行是方法名

生成dll文件plus.dll

 

gcc -shared -o plus.dll plus.o plus.def

 

(6)拷贝plus.dll到工程目录下

*:System.loadLibrary("plus")的引号中是文件在工程的相对路径,默认是工程文件的根目录。

执行java文件,生成结果。

 

    附件为测试代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值