2012-02-28 3 views
9

작은 응용 프로그램에 Java를 사용하고 있습니다. 기존 MFC 프로젝트를 다시 작성합니다. JNI를 사용하여 Java에서 액세스 할 수있게하려면 기존 DLL이 필요합니다. 이 자바 물건은 모두 새로운 것이므로 다른 포럼 게시물을 읽었을 때 약간의 문제가 있으며 밀도가 높습니다. 기존의 dll에는 다음과 같은 함수가 있습니다.Java에서 C++ dll 호출

extern "C" __declspec(dllexport) bool Create() 
{ 
    return TRUE; 
} 

멍청한 질문 시간. Java에 의해 호출되도록 올바르게 설정하려면 어떻게해야합니까?

JNIEXPORT jboolean JNICALL Create() 
{ 
    return TRUE; 
} 

내가 jni.h 모든 것이 잘 컴파일을 포함하고 있습니다 :

나는이 시도. 그러나 Java에서 호출 할 때 UnsatisfiedLinkError가 발생합니다. Java를 다음과 같이 사용하여 호출합니다.

public static native boolean CreateSession(); 

System.load("D:\\JavaCallTest.dll"); 
Create(); 

친절하게도 적절한 방향으로 나를 밀어 낼 수 있습니까? 진심으로 감사드립니다.

감사합니다,

+1

Sun의 예를 보았습니까? http://java.sun.com/developer/onlineTraining/Programming/JDCBook/jniexamp.html – Etienne

+1

또는 JNA에서로드 할 수있는 C DLL이 있으므로 JNI 대신 JNA를 사용할 수 있습니다. – ecle

+0

던져진 예외를 게시하십시오 ... – quaylar

답변

7

당신은 예를 들어, 네이티브 코드에서 자바 클래스의 이름과 경로를 포함해야

extern "C" 
JNIEXPORT jboolean JNICALL Java_com_example_NativeCode_CreateSession(JniEnv* env, jclass clazz) 
{ 
    return JNI_TRUE; 
} 

모든 JNI 메소드는 처음 두 매개 변수로 JNIEnv 포인터와 클래스를가집니다.

+0

그건 그랬어. 지금 일하고있는 것 같습니다. 이와 같은 간단한 기능을 다루지 않을 때 나는 어떤 종류의 문제가 발생하는지 살펴볼 것입니다. 도움에 감사드립니다. – nickfinity

+0

@GooseSerbus 사용되는 매개 변수는 무엇입니까? public static native boolean CreateSession (?,?); – Aniket

+0

@Aniket 매개 변수는 C 메소드의 매개 변수에 추가됩니다. 예 :'public static native boolean CreateSession (boolean, Object); 은'JNIEXPORT jboolean JNICALL Java_com_example_NativeCode_CreateSession (JniEnv * env, jclass clazz, jboolean b, jobject o) ' – GooseSerbus

1

나는 비슷한 문제가 있었다 - 기존 C-코드베이스 난 자바에서 액세스 할 필요가 있었다. 그것은 SWIG, 중간 C++ DLL (C 코드를 호출하는), C++ DLL을 호출하는 Java 코드를 생성하는 도구에 익숙해 지도록 저를 지불했습니다. 당신이 포장하는 DLL의 단지 1 기능 이상이있는 경우

, 그것은 ... 그렇지 않으면 당신은 JNI에 익숙해해야 할 것,이 도구를 체크 아웃

편집을 갚을 수 있습니다

System.load() 호출로 DLL을 찾을 수없는 것 같습니다. System.loadLibrary()을 시도 할 수도 있지만 DLL은 Java 시스템 등록 정보 java.library.path으로 표시된 경로에 있어야합니다. 이 경우에는 전체 파일 이름을 전달하지 말고 확장명이없는 파일 이름 만 전달하십시오.

+0

DLL을 찾고 있었지만 제대로 함수를 선언하지 않았습니다. 나는 SWIG를 조사해야 할 것이다. 팁 고마워. – nickfinity

2

정적 기본 방법은 아직 적어도 두 개의 파라미터를 필요 :

JNIEnv *env 
jclass clazz 

함수 이름은 또한 Java 패키지 구조에 대응한다.

JNIEXPORT jboolean JNICALL Java_com_example_CreateSession(JNIEnv *env, jclass clazz) 

이상적으로, 당신은 네이티브 메소드를 선언하는 자바 클래스의 헤더 파일을 생성하기 위해 javah 툴을 사용하고 선언 된 함수 프로토 타입을 구현한다.

public class NativeCode { 
    public static native boolean CreateSession(); 
} 

및 클래스 경로 (예를 들어)이었다 com.example.NativeCode는 것 : 당신의 기본 방법은 자바에서 선언 된 경우

+0

+1은 함수 서명을 생성하는 데 javah를 사용해야한다는 것을 언급합니다. –

+0

javah를 실행하기 위해 Eclipse를 설치하고 이것을 찾으십시오. (http://stackoverflow.com/a/3452258/978528). 지금 일하는 중. 이제 나머지 부분을 구현해야합니다. 바라기를 바랍니다. – nickfinity