2011-04-27 3 views
7

저는 Java에서 JNI로 나중에 다시 전달할 수 있도록 구조체를 JNI에서 Java로 포인터로 전달하려고합니다. 이 스레드를 읽었습니다 : Passing pointers between C and Java through JNI,하지만 성공하지 못했습니다. 내가 전화를 다음long을 사용하여 JNI에서 Java로 포인터를 전달합니다.

JNIEXPORT jlong JNICALL Java_example_ExampleJNI_getStruct(JNIEnv *jenv, jclass jcls) { 
    struct myStruct_s mystruct; 
    long *lp = (long*)&myStruct; 
    return lp; 
} 

: struct myStruct_s myStruct;

자바에서, 나는 JNI 기능 구조를 초기화하고 (구조에 대한 포인터) 긴을 반환 전화 :

나는 꽤 복잡한 구조를 가지고 그 인수가 길어지는 Java 메소드. JNI에서는 이전에 만든 strcuture를 사용할 수 있기를 원합니다. 나는 이렇게 좋아한다 :

JNIEEXPORT jint JNICALL Java_example_ExampleJNI_methode1(JNIEnv *jenv, jclass jcls, jlong jarg) { 
    struct myStruct_s *arg = (struct myStruct_s *)&jarg; 
    ... 
} 

잘 작동하지 않는다. 구조체에 오랫동안 내 캐스트가 잘못되었다고 생각합니다. 어떻게해야합니까? 감사합니다.


편집 : 힌트를 주셔서 감사합니다, 여기

JNIEXPORT jint JNICALL Java_example_ExampleJNI_methode1(JNIEnv *jenv, jclass jcls, jlong jarg) { 
    struct myStruct_s *arg; 
    arg = (struct myStruct_s *)jarg; 
    ... 
} 

JNIEXPORT jlong JNICALL Java_example_ExampleJNI_getStruct(JNIEnv *jenv, jclass jcls) { 
    struct myStruct_s *myStruct; 
    myStruct = (struct myStruct_s *)malloc(sizeof(struct myStruct_s)); 
    long lp = (long)myStruct; 
    return lp; 
} 
+1

대상 플랫폼에 따라 'jlong'이 반드시 'long'과 같지 않음을 유의하십시오. 실제로'long long' 인 플랫폼에서이 작업을 실행하는 경우이 작업은 실패하므로 항상'jlong'을 명시 적으로 형변환해야합니다. – NeoNacho

+0

leochab하지만 Java 레이어에서 strct 객체에 액세스하는 방법은 무엇입니까? 구조체 내부에 정의 된 지역 변수에 액세스하는 방법. 또한 일부 C++ 클래스 객체와 동일한 작업을 수행 할 수 있습니다. 나는 비슷한 [여기] (http://stackoverflow.com/q/32840427/2624806)을 따르고있다. – CoDe

답변

5

당신의 예에서 작업 기능

struct myStruct_s mystruct; 

따라서 사용할 수 없습니다 스택에 지역 변수, 그리고 있습니다 함수가 반환 된 후 Possubly 그것은 단지 코드를 줄 였지만, 그렇지 않다면 malloc (sizeof (struct myStruct_s))을 사용하여 힙 할당을 얻으십시오.

그렇다면 할당을 해제하고 메모리 누수가 발생하는지 조심해야합니다.

additiona에서
1

@에 Moise의 제안은 내가보다 long ratehr 포인터를 캐스팅 것 long *

long lp = (long)&myStruct; 
3

이 구조의 메모리가 스택에 넣고 있기 때문에 방법은없는 반환 된 후 파괴 힙에, 그것을 시도 :

JNIEXPORT jlong JNICALL Java_example_ExampleJNI_getStruct(JNIEnv *jenv, jclass jcls) { 
    long *lp = (long*)malloc(sizeof(struct myStruct_s)); 
    return lp; 
} 

시를 왜 * 길고 간단하지?

관련 문제