JAVA如何调用C语言编写的程序,并且传参数,读取返回结果?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA如何调用C语言编写的程序,并且传参数,读取返回结果?相关的知识,希望对你有一定的参考价值。
JAVA调用C语言编写的一个程序,并且给C语言编写的这个程序传参数(参数是一个xml文件的路径),最后读取返回结果。
JAVA该怎么做,高分求高手解答,最好给个例子,急急急!!!
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语言编写的程序,并且传参数,读取返回结果?的主要内容,如果未能解决你的问题,请参考以下文章
java调用java编写的WebService接口服务端收到的参数为空