我對JNI比較陌生,並且已經弄清了使用JNI在Java對象中整數和數組混亂的基礎知識。現在我試圖修改/訪問Java對象內的Java對象。使用JNI在C中訪問Java對象中的Java對象
我一直在尋找互聯網和堆棧溢出,還沒有找出如何做到這一點。
下面是這個例子。
在Java:
public class ObjectOne
{
private byte[] buff;
...
...
}
public class ObjectTwo
{
private ObjectOne obj;
...
...
}
在JNI,如何從ObjectOne通過ObjectTwo訪問 「迷」?我試過這樣的事情...
JNIEXPORT void JNICALL Java_accessBuffThroughObjectTwo(JNIEnv *env, jobject obj, jobject objectTwo)
{
jclass clazz;
jclass bufferClazz;
jobject bufferJObject;
clazz = (*env)->GetObjectClass(env, objectTwo);
fid = (*env)->GetFieldID(env, clazz, "obj", "Ljava/lang/Object;");
bufferJObject = (*env)->GetObjectField(env, javascsicommand, fid);
bufferClazz = (*env)->GetObjectClass(env, bufferJObject); <-- Fails here for Access Violation
fid = (*env)->GetFieldID(env, bufferClazz, "buff", "[B");
}
對我在做什麼有什麼幫助錯?
第一步是檢查每個JNI調用,看看它是否失敗。第二:什麼是「javascsicommand」? – 2012-08-03 22:51:54
我相信你將'obj'實例的錯誤值傳遞給[GetObjectField](http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html#wp16572 )。 查看正確的描述符: 'jobject GetObjectField(JNIEnv * env,jobject obj,jfieldID fieldID);' – oldrinb 2012-08-04 02:55:20
也許你打算通過'objectTwo'而不是'javascsicommand'? – oldrinb 2012-08-04 02:58:59