2010-06-29 8 views
2

JNI를 사용하여 Java에 C 배열을 제대로 전달하는 방법에 대한 몇 가지 질문을 보았습니다. 역의 문제가 있습니다. JNI를 사용하여 C에서 int 배열 getter 메서드를 제대로 호출하려면 어떻게합니까? . 특히, BufferedImage 인스턴스를 C에 전달하고이 BufferedImage 인스턴스에서 "public int [] getRGB()"메서드를 호출하려고합니다.JNI의 int 배열 얻기

나의 이해는 모든 배열은 자바 객체가 있다는 것입니다, 그래서 내가 전화해야한다고 가정 : (* ENV) -> CallObjectMethod() 이 배열을 얻기 위해,하지만 난이, 내 JVM을하려고 할 때 충돌. 어떤 제안?

답변

1

C++에서 호출하는 경우 env 포인터가 유효하지 않을 수 있습니다. JVM 인스턴스를 수동으로 바인드해야합니다. 은 C에서 다음과 같은 무언가 :

JNIEnv *env; 
(*g_vm)->AttachCurrentThread (g_vm, (void **) &env, NULL); 

귀하의 g_vm 포인터가 DLL에서 JNI 설정 기능 호출에서 제공해야하며, 나중에 그것을 저장해야합니다.

+0

감사합니다. C에서 JVM을 호출하는 경우에만 현재 스레드를 연결해야한다고 생각합니다 (100 %가 아닌이 경우). 나는 보통 자바 클래스로 JVM을 시작했다. 필자는 클래스에서 BufferedImage의 rgb 값에 더 쉽게 액세스 할 수 있도록 약간의 도우미 메서드를 만들어 문제를 해결했다고 생각합니다. – marcus

+0

쿨, 걱정 마세요 :) –

1

기록에 따르면, 당신이 한 일은 정확하다고 생각합니다. 다음 코드는 내가 (나는 당신이 코드를 제공하지 않았기 때문에 정확히라는 것을 모르는) 생각 트릭을 할 것입니다 :

jobject jBufferedImage = ...; 
... 
jclass clazz = (*env)->FindClass("java/awt/Image/BufferedImage"); 
jmethodID jMID = (*env)->GetMethodID(clazz, "getRGB", "()[I"); 
jintArray rgbValues = (jintArray) (*env)->CallObjectMethod(jBufferedImageObject, jMID); 

는 테스트 컴파일,하지만 그건 내가 할 줄 방법하지 않았 그것 :

건배