java调用c接口
A. java用jna调用c语言dll接口中的回调函数怎么写
简单的你会写,那就好办,直接上代码
{
{
/**
*登录回调
*/
voidinvoke(StringuserId,longretCode,StringretMsg);
}
/**
*注册一个登录回调方法.此方法是dll提供的
*/
voidRegisterLoginReply(LoginReplyloginReply);
}
/**
*实现登录回调方法
*/
.LoginReply{
@Override
publicvoidinvoke(StringuserId,longretCode,StringretMsg){
log.info("登录回调方法:{},{},{}",userId,retCode,retMsg);
}
}
//设置登录回调
api.RegisterLoginReply(loginReplyCallBack);
B. 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
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杩愯屽畠锛屽氨鍙浠ヨ傚疗鍒扮粨鏋滀简銆
D. 浠涔堟牱镄勬妧链鑳借﹋ava璋幂敤c璇瑷镄勪唬镰
java琚缂栬疟鎴愬瓧鑺傜爜钖庣敱JVM瑙i喷镓ц岋纴java瑕佽皟鐢–璇瑷鍐欑殑绋嫔簭锛岄偅涔埚氨蹇呴’阃氲繃JVM璋幂敤锛宩ava锻婅瘔JVM鎴戣佽皟鐢ㄦ湰鍦版搷浣灭郴缁熺殑闾d釜绋嫔簭娈碉纸濡俤ll锛夊苟瑕佹眰杩斿洖涓涓缁撴灉銆傞氲繃JVM璋幂敤链鍦扮▼搴忕殑鎶链灏辨槸JNI锛宩ava Native interface(链鍦版帴鍙f妧链)銆
java鏄阃氲繃铏氭嫙链哄疄鐜拌法骞冲彴鎶链镄勶纴锲犳よ佽皟鐢ㄦ湰鍦版搷浣灭郴缁熺浉鍏崇殑浠g爜锛屽氨蹇呴’閲囩敤JNI鎶链銆傝岃繖灏卞艰嚧浜呙AVA涓庢搷浣灭郴缁熺殑涓绉嶅簲鐢ㄧ粦瀹氾纴澶卞幓浜呜法骞冲彴镄勭壒镩层傚綋铹舵垜浠鍦ㄥ簲鐢ㄤ腑鍙鑳介渶瑕佷娇鐢ㄦ湰鍦颁唬镰佹妧链镟村姞瀹规槗瀹炵幇镆愪釜鏂规硶锛岄噰鐢ㄨ繖绉嶆柟寮忔湁镞朵篃鏄蹇呴’镄勚
鍏跺疄涓岖′綘鏄鐢–杩樻槸鍏朵粬璇瑷缂栬疟镄勪唬镰侊纴鍙瑕佺﹀悎璋幂敤瑙勫垯锛屽氨鍙浠ュ疄鐜癹ava瀵规湰鍦扮▼搴忕殑璋幂敤銆
E. 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文件。
F. JAVA调用C语言发布的webservice接口
Java调用WebService可以直接使用Apache提供的axis.jar自己编写代码,或者利用Eclipse自动生成WebService Client代码,利用其中的Proxy类进行调用。理论上是一样的,只不过用Eclipse自动生成代码省事些。
1、编写代码方式:
packagecom.yun.test;
importjava.rmi.RemoteException;
importorg.apache.axis.client.Call;
importorg.apache.axis.client.Service;
importorg.apache.axis.message.PrefixedQName;
importorg.apache.axis.message.SOAPHeaderElement;
importcom.cezanne.golden.user.Exception;
importcom.cezanne.golden.user.UserManagerServiceProxy;
importjavax.xml.namespace.QName;
importjava.net.MalformedURLException;
importjavax.xml.rpc.ServiceException;
importjavax.xml.soap.Name;
importjavax.xml.soap.SOAPException;
publicclasstestWebService{
publicstaticStringgetResult()throwsServiceException,MalformedURLException,RemoteException,SOAPException
{
//标识WebService的具体路径
Stringendpoint="WebService服务地址";
//创建Service实例
Serviceservice=newService();
//通过Service实例创建Call的实例
Callcall=(Call)service.createCall();
//将WebService的服务路径加入到call实例之中.
call.setTargetEndpointAddress(newjava.net.URL(endpoint));//为Call设置服务的位置
//由于需要认证,故需要设置调用的SOAP头信息。
NameheaderName=newPrefixedQName(newQName("发布的wsdl里的targetNamespace里的url","string_itemName"));
org.apache.axis.message.SOAPHeaderElementheader=newSOAPHeaderElement(headerName);
header.addTextNode("blablabla");
call.addHeader(header);
//=newSOAPHeaderElement("发布的wsdl里的targetNamespace里的url","SoapHeader");
//soapHeaderElement.setNamespaceURI("发布的wsdl里的targetNamespace里的url");
//try
//{
//soapHeaderElement.addChildElement("string_itemName").setValue("blablabla");
//}
//catch(SOAPExceptione)
//{
//e.printStackTrace();
//}
//call.addHeader(soapHeaderElement);
//调用WebService的方法
org.apache.axis.description.OperationDescoper;
org.apache.axis.description.ParameterDescparam;
oper=neworg.apache.axis.description.OperationDesc();
oper.setName("opName");
param=neworg.apache.axis.description.ParameterDesc(newjavax.xml.namespace.QName("","arg0"),org.apache.axis.description.ParameterDesc.IN,newjavax.xml.namespace.QName(","string"),java.lang.String.class,false,false);
param.setOmittable(true);
oper.addParameter(param);
param=neworg.apache.axis.description.ParameterDesc(newjavax.xml.namespace.QName("","arg1"),org.apache.axis.description.ParameterDesc.IN,newjavax.xml.namespace.QName(","string"),java.lang.String.class,false,false);
param.setOmittable(true);
oper.addParameter(param);
param=neworg.apache.axis.description.ParameterDesc(newjavax.xml.namespace.QName("","arg2"),org.apache.axis.description.ParameterDesc.IN,newjavax.xml.namespace.QName(","string"),java.lang.String.class,false,false);
param.setOmittable(true);
oper.addParameter(param);
oper.setReturnType(newjavax.xml.namespace.QName(","string"));
oper.setReturnClass(java.lang.String.class);
oper.setReturnQName(newjavax.xml.namespace.QName("","return"));
oper.setStyle(org.apache.axis.constants.Style.WRAPPED);
oper.setUse(org.apache.axis.constants.Use.LITERAL);
oper.addFault(neworg.apache.axis.description.FaultDesc(
newjavax.xml.namespace.QName("发布的wsdl里的targetNamespace里的url","Exception"),
"Exception",
newjavax.xml.namespace.QName("发布的wsdl里的targetNamespace里的url","Exception"),
true
));
call.setOperation(oper);
call.setOperationName(newjavax.xml.namespace.QName("发布的wsdl里的targetNamespace里的url","opName"));
//调用WebService,传入参数
Stringres=(String)call.invoke(newObject[]("arg0","arg1"));
System.out.println("===============");
returnres;
}
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
try{
System.out.println(getResult());
}catch(MalformedURLExceptione){
e.printStackTrace();
}catch(RemoteExceptione){
e.printStackTrace();
}catch(ServiceExceptione){
e.printStackTrace();
}catch(SOAPExceptione){
e.printStackTrace();
}
}
}
2、利用Eclipse自动生成WebService client代码就容易多了:
首先,new project,选择other,在输入框中输入Web Service Client,选中搜索后的结果,点击Next,在Service definition中输入 WebService的发布地址,点击Finish
这样,WebService Client代码已经生成好了。
接下来写一个Test类,在main函数中输入如下代码:
Stringendpoint="服务器的WebService的地址";
YourWebServiceNameProxyumsp=newYourWebServiceNameProxy(endpoint);
try{
StringresultStr=umsp.opMethod("arg0","arg1");
System.out.println(resultStr);
}catch(Exceptione){
System.out.println("异常");
e.printStackTrace();
}catch(RemoteExceptione){
System.out.println("RemoteException异常");
e.printStackTrace();
}
G. 用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对应,应该可以 。
H. 怎样用 jni来交互java与 c/c++
JNI是Java Native Interface的缩写,中文为JAVA本地调用。使用JNI可以很方便的用我们的Java程序调用C/C++程序。很多时候,某些功能用Java无法实现,比如说涉及到底层驱动的一些功能,这时候我们就可以利用JNI来调用C或者C++程序来实现,这就是JNI的强大之处。但是JNI也有它的缺点,使用java与本地已编译的代码交互,通常会丧失平台可移植性。
下面是一个JNI例子,调用C++输出"hello world":
第一步:创建Java类,在里面定义一个本地方法(用native关键字修饰的方法)
public native void sayHello();
第二步:使用javah命令(javah 类的全路径)生成本地方法的C++头文件
在DOS窗口中进入工程所在目录,然后执行javah com.test.TestNative命令,执行完之后就会在当前目录生成一个后缀名为.h的头文件,如com_test_TestNative.h,这个头文件是根据包名和类名来命名的。
1 /* DO NOT EDIT THIS FILE - it is machine generated */
2 #include <jni.h>
3 /* Header for class com_test_TestNative */
4
5 #ifndef _Included_com_test_TestNative
6 #define _Included_com_test_TestNative
7 #ifdef __cplusplus
8 extern "C" {
9 #endif
10 /*
11 * Class: com_test_TestNative
12 * Method: sayHello
13 * Signature: ()V
14 */
15 JNIEXPORT void JNICALL Java_com_test_TestNative_sayHello
16 (JNIEnv *, jobject);
17
18 #ifdef __cplusplus
19 }
20 #endif
21 #endif
15、16行是对TestNative类中的本地方法sayHello()的声明。这个h文件相当于我们在java里面的接口,这里声明了一个 Java_com_test_TestNative_sayHello (JNIEnv *, jobject);方法,然后在我们的本地方法里面实现这个方法,也就是说我们在编写C/C++程序的时候所使用的方法名必须和这里的一致。
第三步:编写C/C++本地代码,生成动态链接库文件
首先在VC6.0(当然也可以用其他工具)中创建一个dll工程---Win32 Dynamic-Link Library工程。然后将上面生成的头文件com_test_TestNative.h添加到该工程中,然后创建一个源文件引用该头文件并且实现头文件中本地函数的功能:
1 #include<iostream.h>
2 #include"com_test_TestNative.h"
3
4 JNIEXPORT void JNICALL Java_com_test_TestNative_sayHello(JNIEnv *env, jobject obj)
5 {
6 cout<<"hello world!"<<endl;
7 }
这里因为com_test_TestNative.h中引入了jni.h所以要将jni.h加入到VC6.0安装目录下的Include目录中。jni.h在JDK安装目录下的include中,同时得件include/win32中的两个头文件jawt_md.h、jni_md.h也导入到VC6.0中。
将所依赖的头文件导入之后,我们就可以构建该工程了,按F7就行了,完了会在工程目录中的Degug目录下生成一个动态链接库文件,我这里生成的是NativeCode.dll。我们就可以将该dll文件拷贝到环境变量path所包含的目录下给咱们的Java程序调用了,为了方便,我们也可以将dll所在的工程目录加入到环境变量path中去,这样可以避免每次都要拷贝的麻烦。注意修改环境变量之后要重启myeclipse。
第四步:Java调用本地函数
1 package com.test;
2
3 public class TestNative {
4 public native void sayHello();
5
6 /**
7 * @param args
8 */
9 public static void main(String[] args) {
10 System.loadLibrary("NativeCode");
11 TestNative tNative = new TestNative();
12 tNative.sayHello();
13 }
14 }
第10行是加载动态链接库,JVM只需要加载一次就可以调用了,“NativeCode”是上面生成的动态链接库的名字,不含后缀名。
运行该程序,成功打印输出了"hello world"。