JAVA如何调用C语言编写的程序,并且传参数,读取返回结果?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA如何调用C语言编写的程序,并且传参数,读取返回结果?相关的知识,希望对你有一定的参考价值。

JAVA调用C语言编写的一个程序,并且给C语言编写的这个程序传参数(参数是一个xml文件的路径),最后读取返回结果。
JAVA该怎么做,高分求高手解答,最好给个例子,急急急!!!

参考技术A java要想调用c的程序,那就要把c生成dll文件给java调用,也就是java调用dll文件,如何调用呢,就要使用java的本地化方法JNI调用c的dll文件。

1、java部分。

实例1:Sample1.java文件

public class Sample1

public native int intMethod(int n);

public native boolean booleanMethod(boolean
bool);

public native String stringMethod(String
text);

public native int intArrayMethod(int[] args);

public static void main(String[] args)

System.loadLibrary("Sample1");
Sample1 sample =
new Sample1();
int square =
sample.intMethod(5);
boolean bool =
sample.booleanMethod(true);
String text =
sample.stringMethod("JAVA");
int sum = sample.intArrayMethod(new
int[] 1, 1, 2, 3, 5, 8, 13 );

System.out.println("intMethod: " +
square);
System.out.println("booleanMethod: " +
bool);
System.out.println("stringMethod: " +
text);
System.out.println("intArrayMethod: " +
sum);




2、用javac编译成Sample1.class,然后用javah编译Sample1,生成Sample1.h文件。具体的命令如下:

javac Sample1.java

javah Sample1

3、打开生成的Sample1.h,代码如下:

#include <jni.h>

#ifndef _Included_Sample1
#define
_Included_Sample1
#ifdef __cplusplus
extern "C"

#endif

JNIEXPORT jint JNICALL Java_Sample1_intMethod

(JNIEnv *, jobject, jint);

JNIEXPORT jboolean JNICALL
Java_Sample1_booleanMethod
(JNIEnv *, jobject, jboolean);

JNIEXPORT jstring JNICALL
Java_Sample1_stringMethod
(JNIEnv *, jobject, jstring);

JNIEXPORT jint JNICALL
Java_Sample1_intArrayMethod
(JNIEnv *, jobject, jintArray);

#ifdef __cplusplus

#endif
#endif
这个文件主要是为了生成java调用c的主要方法,也即是上面的几个方法。

3、用c语言的程序来实现上班生成的几个方法,即Sample1.c源代码如下:

#include "Sample1.h"
#include
<string.h>

JNIEXPORT jint JNICALL Java_Sample1_intMethod
(JNIEnv
*env, jobject obj, jint num)
return num *
num;


JNIEXPORT jboolean JNICALL
Java_Sample1_booleanMethod
(JNIEnv *env, jobject obj, jboolean
boolean)
return !boolean;



JNIEXPORT jstring JNICALL
Java_Sample1_stringMethod
(JNIEnv *env, jobject obj, jstring string)

const char *str = (*env)->GetStringUTFChars(env, string,
0);
char cap[128];
strcpy(cap,
str);
(*env)->ReleaseStringUTFChars(env, string,
str);
return (*env)->NewStringUTF(env,
strupr(cap));


JNIEXPORT jint JNICALL
Java_Sample1_intArrayMethod
(JNIEnv *env, jobject obj, jintArray
array)
int i, sum = 0;
jsize len =
(*env)->GetArrayLength(env,array);
jint *body =
(*env)->GetIntArrayElements(env, array, 0);
for
(i=0; i<len; i++)
sum +=
body[i];


(*env)->ReleaseIntArrayElements(env, array, body, 0);

return sum;


void
main()

4、创建dll文件。如果你的jdk的路径为C:\jdk\的话那么你可以用cl命令生成dll文件,但是你可能要安装vc

windows平台命令如下:cl -IC:\jdk\include -IC:\jdk\include\win32 -LD Sample1.c
-FeSample1.dll

运行如上命令就可以生成你所需要的dll文件了

5、如果上述都成功的话,那么我们的工作基本上就做完了,运行测试程序就可以的了,即运行Sample1.java,命令如下:

java Sample

如果运行成功的话,结果如下:

intMethod: 25
booleanMethod: false

stringMethod: JAVA
intArrayMethod:
33

至此我们调用c已经完成了。

谁能说一下C语言参数传值和传引用是啥概念,谢谢!:)?

你好,首先纠正一下你的一个错误,C语言里没有引用的概念。引用就是一个别名,定义一个变量a,再定义一个引用c,即 int &c = a;就是给a变了个别名,实际上是一个实体。传值就是将变量的值复制一遍,在函数调用栈上使用,还有一个传指针,即传变量地址,就是将变量的地址传到函数栈上去,这样,函数在栈上执行对该变量的操作都会直接操作到原变量的值。传引用和传指针都能直接改变原变量的值,而传值不能修改原变量,只能修改它们的复制品(即在栈上建立的变量并被赋予了传进来的变量的值); 参考技术A C语言只能“参数传值”,没有“引用传递”。
C++有引用传递。传值就是传递值,引用传递就是传地址,可以形实参数可以同步变化。本回答被提问者和网友采纳
参考技术B 传值只是把这个变量的值赋给形参,改变形参的值,实参不变。传引用时改变形参,实参也会改变。

以上是关于JAVA如何调用C语言编写的程序,并且传参数,读取返回结果?的主要内容,如果未能解决你的问题,请参考以下文章

如何将命令行参数传递给 c 程序

java 如何将二维数组的一列作为参数传进去 求代码

python 外部传参程序编写并打包exe及其调用方式

java调用java编写的WebService接口服务端收到的参数为空

c语言 两个函数(传值和传引用)并且比较两者的不同,题目自设

谁能说一下C语言参数传值和传引用是啥概念,谢谢!:)?