C\#자바 호출 방법 인 스 턴 스 상세 설명

7435 단어 c호출자바
C\#C++의 DLL 과 JAVA 가 작성 한 프로그램 을 직접 참조 할 수 있 습 니 다.최근 에 업무 상의 이유 로 이런 부분 을 많이 접 했 기 때문에 실제 수요 에 따라 우 리 는 구체 적 인 예 를 통 해 JAVA 방법 을 C\#에서 직접 호출 할 수 있 는 DLL 로 바 꾸 었 다.
C\#호출 c++
C\#C++를 호출 하 는 예 는 인터넷 에 많 습 니 다.C++의 구체 적 인 방법 을 예 로 들 면.
C++코드

//         
MVSMARTCAMCTRL_API int __stdcall MV_SC_GetOneFrame(IN void* handle, 
IN OUT unsigned char *pData , 
IN unsigned int nDataSize, 
IN OUT MV_SC_IMAGE_OUT_INFO* pstImageInfo);
//          
#define MV_SC_MAX_RESULT_SIZE (1024*16)
//       
typedef struct _MV_SC_IMAGE_OUT_INFO_
{
unsigned short nWidth; //    
unsigned short nHeight; //    
unsigned int nFrameNum; //   
unsigned int nFrameLen; //        
unsigned int nTimeStampHigh; //     32 
unsigned int nTimeStampLow; //     32 
unsigned int nResultType; //        
//               
unsigned char chResult[MV_SC_MAX_RESULT_SIZE];
unsigned int nReserved[8]; //   
}MV_SC_IMAGE_OUT_INFO 
C#  
/// <summary>
///         
/// </summary>
/// <param name="handle"></param>
/// <returns></returns>
[DllImport("MvSmartCamCtrl.dll")]
public static extern int MV_SC_GetOneFrame(IntPtr handle, Byte[] pData, int nDataSize, out MV_SC_IMAGE_OUT_INFO pstDevInfo);
//       
[StructLayout(LayoutKind.Sequential)]
public struct MV_SC_IMAGE_OUT_INFO
{
public short nWidth; //    
public short nHeight; //    
public int nFrameNum; //   
public int nFrameLen; //        
public int nTimeStampHigh; //     32 
public int nTimeStampLow; //     32 
public int nResultType; //        
//               
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024 * 16)]
public MV_SC_RESULT_BCR chResult;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public int[] nReserved;
}
이렇게 하면 우 리 는 이 DLL 을 프로그램 루트 디 렉 터 리 에 두 면 DLL 방법의 호출 을 실현 할 수 있다.
C\#JAVA 호출 방법
IKVM.NET 은 모 노 와 마이크로소프트.net 프레임 워 크 를 위 한 자바 구현 으로.NET 플랫폼 에서 자바 프로그램 을 실행 하 는 것 이 목적 이다.다음 구성 요 소 를 포함 합 니 다:
.NET 로 구현 되 는 자바 가상 머 신,자바 라 이브 러 리 의.NET 구현.
자바 와.NET 간 의 상호작용 에 주력 하 는 도구 입 니 다.
프로그램 요구 사항
저 희 는 JAVA 가 작성 한 Demo 가 있 습 니 다.전 달 된 매개 변 수 는 Gzip 으로 압축 하여 서버 에 전 달 된 것 입 니 다.코드 는 다음 과 같 습 니 다.

package Demo;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpClientParams;
import com.google.gson.Gson;
public class Demo
{
public static String doPostClient(String json, String url)
{
HttpClient httpClient = new HttpClient();
String rval = "";
PostMethod postMethod = new PostMethod(url);
try
{
Gson gson = new Gson();
InputStream in = new ByteArrayInputStream(objectToByte(json));
postMethod.setRequestBody(in);
HttpClientParams params = new HttpClientParams();
httpClient.setParams(params);
httpClient.executeMethod(postMethod);
byte[] b = postMethod.getResponseBody();
String rtnData = (String) byteToObject(b);
rval = gson.toJson(rtnData);
} catch (Exception e)
{
rval="erro:"+e.getMessage();
} finally
{
postMethod.releaseConnection();
}
return rval;
}
public static byte[] objectToByte(java.lang.Object obj)
{
byte[] bytes = null;
ObjectOutputStream oo = null;
try
{
ByteArrayOutputStream out = new ByteArrayOutputStream();
GZIPOutputStream gzip = new GZIPOutputStream(out);
gzip.write(obj.toString().getBytes("utf-8"));
gzip.close();
bytes = out.toByteArray();
} catch (Exception e)
{
e.printStackTrace();
} finally
{
if (oo != null)
{
try
{
oo.close();
} catch (IOException e)
{
e.printStackTrace();
}
}
}
return bytes;
}
private static java.lang.Object byteToObject(byte[] bytes)
{
String obj = "";
ObjectInputStream oi = null;
try
{
ByteArrayInputStream bi = new ByteArrayInputStream(bytes);
GZIPInputStream gzipi = new GZIPInputStream(bi);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(gzipi, "UTF-8"));
String line;
while ((line = bufferedReader.readLine()) != null)
{
obj+=line; 
}
} catch (Exception e)
{
e.printStackTrace();
} finally
{
if (oi != null)
{
try
{
oi.close();
} catch (IOException e)
{
e.printStackTrace();
}
}
}
return obj;
}
}
이 코드 는 제 가 C\#로 고 쳤 습 니 다.HttpWebRequest 방식 으로 서버 에 전 달 했 습 니 다.서버 쪽 Gzip 에서 압축 을 풀 수 없 는 이 유 는 자바 와 C\#의 Byte 형식 값 범위 가 다 르 기 때 문 입 니 다.우 리 는 두 가지 해결 방향 이 있 습 니 다.하 나 는 이 JAVA 를 웹 서 비 스 를 만들어 서버 에 걸 고 c\#다시 호출 하 는 것 입 니 다.두 번 째 는 이 방법 을 C\#직접 호출 할 수 있 는 DLL 로 컴 파일 하 는 것 입 니 다.이 방법 은 기능 이 비교적 단일 하기 때문에 우 리 는 후 자 를 선택 했다.
환경 설정
IKVM.NET 을 다운로드 한 후 BIN 폴 더 의 데 이 터 를 압축 해제 하여 JAR 패키지 변환 과 기본 DLL 에 사용 합 니 다.
IKVM.OpenJDK.ClassLibrary.dll 은 C\#프로그램 접속 에 사 용 됩 니 다.
다운로드 주소:https://yunpan.cn/cBHTS5fXsIe9v 방문 비밀번호 0847.
환경 변수 에 IKVM.NET 의 BIN 폴 더 주 소 를 추가 합 니 다.
컴퓨터 오른쪽 키 속성-고급 시스템 설정-고급-환경 변수-시스템 변수 에서 PATH 를 찾 아 BIN 폴 더 의 주 소 를 추가 합 니 다.
CMD 에 ikvmc 를 입력 하면 환경 설정 이 성공 했다 는 문 서 를 설명 하 는 데 도움 이 됩 니 다.
Bin 폴 더 에 있 는 IKVM.OpenJDK.Core.dll,IKVM.Runtime.dll,IKVM.Runtime.JNI.dll,IKVM.OpenJDK.ClassLibrary.dll 은 공공 DLL 로 모든 변환 프로그램 이 참조 되 어야 합 니 다.
전환 절차
1.인용 관계 확인:
이 데모 의 구 조 는 다음 과 같다.

Demo.jar 는 comons-httpclient-3.1.jar 와 gson-2.4.jar 에 의존 합 니 다.
comons-httpclient-3.1.jar 는 comons-logging-1.1.3.jar 와 comons-codec-1.6.jar 에 의존 합 니 다.
우 리 는 먼저 gson-2.4.jar,commons-logging-1.1.3.jar,commons-codec-1.6.jar 를 DLL 로 생 성 합 니 다.문법 은 다음 과 같 습 니 다.
ikvmc JAR 패키지 물리 적 경로.
win 7 시스템 은 기본적으로 C:\Users\Administrator 이 폴 더 에서 생 성 됩 니 다.
commons-httpclient-3.1.dll 생 성 문법 은 다음 과 같 습 니 다.
ikvmc commons-httpclient-3.1.jar -r:commons-logging-1.1.3.dll -r:commons-codec-1.6.dll
저 희 는 데모 패키지 의 이름 을 자바 Api.Demo 라 고 합 니 다.이렇게 생 성 된 자바 Api.dll 생 성 문법 은 다음 과 같 습 니 다.
ikvmc JavaApi.Demo.jar -r:commons-httpclient-3.1.dll -r:gson-2.4.dll
위의 파일 은 모두 해당 하 는 물리 적 경로 입 니 다.그리고 생 성 된 모든 DLL 을 C\#항목 에 추가 하여 참조 합 니 다.이전 공공 DLL 을 포함 하여 항목 에 인 용 된 모든 DLL 을 참조 합 니 다.그림 참조:

이렇게 하면 바로 프로그램 에서 이 자바 방법 을 사용 할 수 있다.
Demo.Demo.doPostClient(js, url);
첫 번 째 데모 자바 프로그램의 패키지 이름 입 니 다.
두 번 째 데모 자바 프로그램의 클 라 스 이름 입 니 다.
위 에서 말 한 것 은 편집장 이 여러분 에 게 소개 한 C\#자바 방법 인 스 턴 스 를 호출 하여 상세 하 게 설명 한 모든 서술 입 니 다.여러분 께 도움 이 되 기 를 바 랍 니 다.더 많은 내용 을 알 고 싶 으 시 면 저희 사 이 트 를 주목 하 시기 바 랍 니 다!

좋은 웹페이지 즐겨찾기