- 전체
- JAVA 일반
- JAVA 수학
- JAVA 그래픽
- JAVA 자료구조
- JAVA 인공지능
- JAVA 인터넷
- Java Framework
- Java GUI (AWT,SWING,SWT,JFACE)
- SWT and RCP (web RAP/RWT)[eclipse], EMF
JAVA 일반 자바에서 C# 호출하기
2017.04.26 21:23
자바에서 C# 호출하기
방법 1: 이 블로깅에서 설명하는 방식)
JNI 구현 Visual C++ 프로젝트를 Managed Code로 컴파일 하여 C# 클래스를 직접 호출함
빙법 2)
c# 프로젝트를 netmodule로 컴파일 하여 사용하는 방법도 있으나 아래 명령을 Post Buil에 사용 시
에러가 발생함, 추후 이 방법도 테스트가 필요함
csc /debug /t:module "$(OutDir)$(ProjectName)".dll |
참고 사이트: http://www.codeproject.com/Articles/378826/How-to-wrap-a-Csharp-library-for-use-in-Java
1. C# 클래스 라이브러리 생성
1) 프로젝트 생성 및 클래스 정의
일반적인 방법으로 C# 클래스 라이브러리 프로젝트를 생성하여 아래와 같이 정의한다.
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks;
namespace HelloCSharp { public class HelloClass { public int Sum(int a, int b) { Console.WriteLine("sum = " + (a + b));
return a + b; } } |
2) 타깃 플랫폼을 64비트로 변경
자바가 64비트인데 CPP/C# DLL 이 아닌 경우 에러가 발생한다.
3) 컴파일된 Assembly를 GAC(Global Assembly Cache)에 등록
속성 --> 서명에서 "어셈플리 서명" 체크하고 "강력한 이름 키 파일"을 선택을 한다. 키 파일 없을 경우 콤보 박스에서 "새로 만들기"를 선택하여 키를 생성한다.
다음과 같이 gacutil을 이용하여 Assembly를 GAC(Global Assembly Cache)에 등록한다.
C:\Assembly>"C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\gacutil.exe" /if C:\Assembly\HelloCSharp.dll |
※ 인스톨 및 언 인스톨 시에 gacutil을 이용하여 gac 등록 및 해지를 할 수 있다.
2. 자바 클래스 생성 및 javah로 JNI 해더 생성
public class CSharpCallTestJNI { static { // PATH 설정 혹은 -Djava.library.path로 경로를 설정하여야 함 // System.loadLibrary("winmem");
// 개발 시 불편하므로 클래스 파일 위치에서 dll 경로를 찾아서 // 라이브러리를 로드 하도록 함 System.load(CSharpCallTestJNI.class.getResource("CSharpCallCPP.dll").getPath()); }
public native int callCSharp();
public static void main(String[] args) { CSharpCallTestJNI jni = new CSharpCallTestJNI(); System.out.println("return = " + jni.callCSharp()); } } |
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class CSharpCallTestJNI */
#ifndef _Included_CSharpCallTestJNI #define _Included_CSharpCallTestJNI #ifdef __cplusplus extern "C" { #endif /* * Class: CSharpCallTestJNI * Method: callCSharp * Signature: ()I */ JNIEXPORT jint JNICALL Java_CSharpCallTestJNI_callCSharp (JNIEnv *, jobject);
#ifdef __cplusplus } #endif #endif |
3. 일반적인 방법으로 JNI CPP 프로젝트 생성
64비트 빌드를 이해서는 아래와 같이 구성관리 및 링크 부분 설정을 변경한다.
1) 링커 설정 변경
2) 구성관리 변경
속성 페이지 창에서 구성관리자 버튼을 클릭하여 아래와 같이 타깃 플랫폼을 x64로 변경한다.
3) 공용런타임 지원 설정
VC++ 코드를 Managed Code로 컴파일 하기위하여 아래와 같이 "구성속성 --> C/C++ --> 일반 --> 공용런타임 지원"을 설정한다.
변경 후 다른 설정과 충돌하는 것은 변경한다.
4. C# 호출 코드 작성
#include "stdafx.h"
#include "CSharpCallTestJNI.h" #using "C:\Assembly\HelloCSharp.dll"
JNIEXPORT jint JNICALL Java_CSharpCallTestJNI_callCSharp(JNIEnv *env, jobject obj) { printf("Call Java_CSharpCallTestJNI_callCSharp"); HelloCSharp::HelloClass t; return t.Sum(10, 10); } |
[출처] 자바에서 C# 호출하기|작성자 G1Soft Manager
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.