저는 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;
}
대상 플랫폼에 따라 'jlong'이 반드시 'long'과 같지 않음을 유의하십시오. 실제로'long long' 인 플랫폼에서이 작업을 실행하는 경우이 작업은 실패하므로 항상'jlong'을 명시 적으로 형변환해야합니다. – NeoNacho
leochab하지만 Java 레이어에서 strct 객체에 액세스하는 방법은 무엇입니까? 구조체 내부에 정의 된 지역 변수에 액세스하는 방법. 또한 일부 C++ 클래스 객체와 동일한 작업을 수행 할 수 있습니다. 나는 비슷한 [여기] (http://stackoverflow.com/q/32840427/2624806)을 따르고있다. – CoDe