java程序调用c
Ⅰ java怎么引用c
Java调用c语言程序时,主要是涉及到操作系统底层的事件。这种时间Java无法处理,例如用户上传一个视频文件,需要后台给视频加上水印,或者后台分离视频流和音频流。只能通过调用C语言处理。
使用Java如何去调用C语言的接口呢?使用Java的JNI技术。
具体调用步骤如下:
1.首先创建Java文件 HelloJni.java ,并创建native方法。
2.编译Java文件并生成java头文件。
3.创建C语言文件,HelloWorld.c。
4.生成动态链接库文件 libhello.so。
5.设置动态链接库文件的目录。
6.把刚才生成的so文件拷贝到/home/lib下,然后执行class文件。
Ⅱ Java客户端远程调用C服务器
真没有作过相关的开发,Java和C之间相互调用,本地的使用jni或者是直接发送Windows消息;远程的,都是使用socket通信的。谈一些想法,希望能给你些帮助,纸上谈兵:
1)现在常用的异构系统之间的调用,采用Web Service的方法,没做过,但是应该可以。
2)RMI是Java To Java,另外Sun还提供了RMI-IIOP,这个是综合了RMI和Corba,是可以用在Java和其它语言对象之间的远程调用,但是我没有资料,也许你需要看看Corba的基本知识,如何使用idl来定义C对象的接口.
3)我不知道你对C所在的服务器有什么要求,是否可以运行Java.如果可以,那么有一个方法,你可以做一个Java程序来作为RMI的服务器,然后这个Java程序负责和Java客户通信,通信的方式还是RMI.然后,在这个Java服务程序中,同过jni的方法调用你的C程序.
Ⅲ 鍐欎竴娈礿ava浠g爜锛岃皟鐢╟绋嫔簭锛岄兘链変粈涔埚姙娉
JAVA浠ュ叾璺ㄥ钩鍙扮殑鐗规ф繁鍙椾汉浠锽灭埍锛岃屽张姝g敱浜庡畠镄勮法骞冲彴镄勭洰镄勶纴浣垮缑瀹冨拰链鍦版満鍣ㄧ殑钖勭嶅唴閮ㄨ仈绯诲彉寰楀緢灏戯纴绾︽潫浜嗗畠镄勫姛鑳姐傝В鍐矹AVA瀵规湰鍦版搷浣灭殑涓绉嶆柟娉曞氨鏄疛NI銆
JAVA阃氲繃JNI璋幂敤链鍦版柟娉曪纴钥屾湰鍦版柟娉曟槸浠ュ簱鏂囦欢镄勫舰寮忓瓨鏀剧殑锛埚湪WINDOWS骞冲彴涓婃槸DLL鏂囦欢褰㈠纺锛屽湪UNIX链哄櫒涓婃槸SO鏂囦欢褰㈠纺锛夈傞氲繃璋幂敤链鍦扮殑搴撴枃浠剁殑鍐呴儴鏂规硶锛屼娇JAVA鍙浠ュ疄鐜板拰链鍦版満鍣ㄧ殑绱у瘑镵旂郴锛岃皟鐢ㄧ郴缁熺骇镄勫悇鎺ュ彛鏂规硶銆
绠鍗曚粙缁嶅强搴旂敤濡备笅锛
涓銆丣AVA涓镓闇瑕佸仛镄勫伐浣
鍦↗AVA绋嫔簭涓锛岄栧厛闇瑕佸湪绫讳腑澹版槑镓璋幂敤镄勫簱钖岖О锛屽备笅锛
static {
System.loadLibrary(钬済oodluck钬);
}
鍦ㄨ繖閲岋纴搴撶殑镓╁𪾢钖嶅瓧鍙浠ヤ笉鐢ㄥ啓鍑烘潵锛岀┒绔熸槸DLL杩樻槸SO锛岀敱绯荤粺镊宸卞垽鏂銆
杩橀渶瑕佸瑰皢瑕佽皟鐢ㄧ殑鏂规硶锅氭湰鍦板0鏄庯纴鍏抽敭瀛椾负native銆傚苟涓斿彧闇瑕佸0鏄庯纴钥屼笉闇瑕佸叿浣揿疄鐜般傚备笅锛
public native static void set(int i);
public native static int get();
铹跺悗缂栬疟璇JAVA绋嫔簭鏂囦欢锛岀敓鎴怌LASS锛屽啀鐢↗AVAH锻戒护锛孞NI灏变细鐢熸垚C/C++镄勫ご鏂囦欢銆
渚嫔傜▼搴弔estdll.java锛屽唴瀹逛负锛
public class testdll
{
static
{
System.loadLibrary("goodluck");
}
public native static int get();
public native static void set(int i);
public static void main(String[] args)
{
testdll test = new testdll();
test.set(10);
System.out.println(test.get());
}
}
鐢╦avac testdll.java缂栬疟瀹冿纴浼氱敓鎴恡estdll.class銆
鍐岖敤javah testdll锛屽垯浼氩湪褰揿墠鐩褰曚笅鐢熸垚testdll.h鏂囦欢锛岃繖涓鏂囦欢闇瑕佽猎/C++绋嫔簭璋幂敤𨱒ョ敓鎴愭墍闇镄勫簱鏂囦欢銆
浜屻丆/C++涓镓闇瑕佸仛镄勫伐浣
瀵逛簬宸茬敓鎴愮殑.h澶存枃浠讹纴C/C++镓闇瑕佸仛镄勶纴灏辨槸鎶婂畠镄勫悇涓鏂规硶鍏蜂綋镄勫疄鐜般傜劧钖庣紪璇戣繛鎺ユ垚搴撴枃浠跺嵆鍙銆傚啀鎶婂簱鏂囦欢𨰾疯礉鍒癑AVA绋嫔簭镄勮矾寰勪笅闱锛屽氨鍙浠ョ敤JAVA璋幂敤C/C++镓瀹炵幇镄勫姛鑳戒简銆
鎺ヤ笂渚嫔瓙銆傛垜浠鍏堢湅涓涓媡estdll.h鏂囦欢镄勫唴瀹癸细
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class testdll */
#ifndef _Included_testdll
#define _Included_testdll
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: testdll
* Method: get
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_testdll_get
(JNIEnv *, jclass);
/*
* Class: testdll
* Method: set
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_testdll_set
(JNIEnv *, jclass, jint);
#ifdef __cplusplus
}
#endif
#endif
鍦ㄥ叿浣揿疄鐜扮殑镞跺欙纴鎴戜滑鍙鍏冲绩涓や釜鍑芥暟铡熷瀷
JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass);
鍜
JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint);
杩欓噷JNIEXPORT鍜孞NICALL閮芥槸JNI镄勫叧阌瀛楋纴琛ㄧず姝ゅ嚱鏁版槸瑕佽猕NI璋幂敤镄勚傝宩int鏄浠JNI涓轰腑浠嬩娇JAVA镄刬nt绫诲瀷涓庢湰鍦扮殑int娌熼氱殑涓绉岖被鍨嬶纴鎴戜滑鍙浠ヨ呜屼笉瑙侊纴灏卞綋锅歩nt浣跨敤銆傚嚱鏁扮殑钖岖О鏄疛AVA_鍐嶅姞涓妀ava绋嫔簭镄刾ackage璺寰勫啀锷犲嚱鏁板悕缁勬垚镄勚傚弬鏁颁腑锛屾垜浠涔熷彧闇瑕佸叧蹇冨湪JAVA绋嫔簭涓瀛桦湪镄勫弬鏁帮纴镊充簬JNIEnv*鍜宩class鎴戜滑涓鑸娌℃湁蹇呰佸幓纰板畠銆
濂斤纴涓嬮溃鎴戜滑鐢╰estdll.cpp鏂囦欢鍏蜂綋瀹炵幇杩欎袱涓鍑芥暟锛
#include "testdll.h"
int i = 0;
JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass)
{
return i;
}
JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint j)
{
i = j;
}
缂栬疟杩炴帴鎴愬簱鏂囦欢锛屾湰渚嬫槸鍦╓INDOWS涓嫔仛镄勶纴鐢熸垚镄勬槸DLL鏂囦欢銆傚苟涓斿悕绉拌佷笌JAVA涓闇瑕佽皟鐢ㄧ殑涓镊达纴杩欓噷灏辨槸goodluck.dll
鎶姹oodluck.dll𨰾疯礉鍒皌estdll.class镄勭洰褰曚笅锛宩ava testdll杩愯屽畠锛屽氨鍙浠ヨ傚疗鍒扮粨鏋滀简銆
Ⅳ 用Java怎么调用C语言已经编写好的DLL
1.用System.getProperty("user.dir"),获取程序的路径,估计你的应该是 E:\\测试程序不清楚打印一下就可以了。System.getProperty("user.dir") + "\\DLL\\CardAPI"2.unsigned char 用char就可以了unsigned int 用int就可以了,java的int值很大.....C的无符号的记得是65535 unsigned char*、和unsigned int* 这两个是指针,第一个是取1位地址内容的,第二个根据系统而定,一般是取4位地址值的,用java 的String对应,应该可以 。
Ⅳ 如何用java调用c的编译器
可以调用的,java有一种技术叫JNI,就是为了调用C/C++,至于例子嘛是这样的: 01. public class testdll 02. { 03. static 04. { 05. System.loadLibrary("goodluck"); 06. } 07. public native static int get(); 08. 09. public native static void set(int i); 10. public static void main(String args) 11. { 12. testdll test = new testdll(); 13. test.set(10); 14. System.out.println(test.get()); 15. } 16. 17. } 用javac testdll.java编译它,会生成testdll.class。 再用javah testdll,则会在当前目录下生成testdll.h文件,这个文件需要被C/C++程序调用来生成所需的库文件。 二、C/C++中所需要做的工作 对于已生成的.h头文件,C/C++所需要做的,就是把它的各个方法具体的实现。然后编译连接成库文件即可。再把库文件拷贝到JAVA程序的路径下面,就可以用JAVA调用C/C++所实现的功能了。 好,下面我们用testdll.cpp文件具体实现这两个函数: 01. #include "testdll.h" 02. int i = 0; 03. JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass) 04. { 05. return i; 06. } 07. JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint j) 08. { 09. i = j; 10. } 编译连接成库文件,本例是在WINDOWS下做的,生成的是DLL文件。并且名称要与JAVA中需要调用的一致,这里就是goodluck.dll http://ask.wangmeng.cn/question/88
Ⅵ Java如何调用C语言代码
Java Native Interface(JNI)是Java语言的本地编程接口,是J2SDK的一部分。在java程序中,我们可以通过JNI实现一些用java语言不便实现的功能。通常有以下几种情况我们需要使用JNI来实现。 标准的java类库没有提供你的应用程序所需要的功能,通常这些功能是平台相关的 你希望使用一些已经有的类库或者应用程序,而他们并非用java语言编写的 程序的某些部分对速度要求比较苛刻,你选择用汇编或者c语言来实现并在java语言中调用他们 下面我们开始编写HelloWorld程序,由于涉及到要编写c/c++代码因此我们会在开发中使用Microsoft VC++工具。编写java代码,我们在硬盘上建立一个hello目录作为我们的工作目录,首先我们需要编写自己的java代码,在java代码中我们会声明native方法,代码非常简单。如下所示 class HelloWorld { public native void displayHelloWorld(); static { System.loadLibrary("hello"); } public static void main(String[] args) { new HelloWorld().displayHelloWorld(); } } 注意我们的displayHelloWorld()方法的声明,它有一个关键字native,表明这个方法使用java以外的语言实现。方法不包括实现,因为我们要用c/c++语言实现它。注意System.loadLibrary("hello")这句代码,它是在静态初始化块中定义的,系统用来装载hello共享库,这就是我们在后面生成的hello.dll(如果在其他的操作系统可能是其他的形式,比如hello.so) 编译java代码 javac HelloWorld.java 生成HelloWorld.class文件 创建.h文件 这一步中我们要使用javah命令生成.h文件,这个文件要在后面的c/c++代码中用到,我们运行 javah HelloWorld。这样我们可以看到在相同目录下生成了一个HelloWorld.h文件,文件内容如下 在此我们不对他进行太多的解释。 /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class HelloWorld */ #ifndef _Included_HelloWorld #define _Included_HelloWorld #ifdef __cplusplus extern "C" { #endif /* * Class: HelloWorld * Method: displayHelloWorld * Signature: ()V */ JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif 编写本地实现代码 在这部分我们要用C/C++语言实现java中定义的方法,我们在VC++中新建一个Project,然后创建一个HelloWorldImp.cpp文件,内容如下 #include <jni.h> #include "HelloWorld.h" #include <stdio.h> JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj) { printf("Hello world!\n"); return; } 注意我们这里include了 jni.h和刚才得到的HelloWorld.h文件。因此你要在VC++里面设置好,jni.h在JAVA_HOME/include里面。编译通过后再生成hello.dll文件。 运行java程序 把上面生成的hello.dll文件复制到我们的工作目录,这时候我们的目录中包括HelloWorld.java,HelloWorld.class和hello.dll文件。运行java HelloWorld命令,则可在控制台看到Hello world| 的输出了。运行VC++; 文件---新建---选“win32 console application”(控制台程序)---在右方设置好路径并输入工程名---确定 接下来的几个提示框点确定就行了,那是提示是否要用VC++提供的框架之类的 在左边的工作空间中选“FILEVIEW”标签项,点开“+”号,右键点击“SOURCE FILES”,选“添加文件到目录”,此即添加你要建立的C++源程序文件,会提示你没有文件,是否添加,你点是,输入文件名保存就OK了 然后SOURCE FILES下就出现了你刚才建立的*.CPP文件,双击,输入代码. 以下就是点”组建”菜单中的”编译”、”组建”等命令进行调试了。 相信你会了。 http://hi..com/%C7%E9%D4%B5and%D3%D1%D2%EA/blog/item/34084645e8560f23cefca3b7.html