使用包通过自己的数据类型从C到Java的JNI方法调用

时间:2013-02-23 23:09:03

标签: java c java-native-interface package

我想将测试对象(通过我自己的类TestObject创建)传递给本机C方法,该方法然后读取包含“TestObject2”类型对象的字段“testObject2”。 testObject2的名称是其类的属性之一,也是普通的Java String。

请考虑以下代码:

#include "JNI_Main.h"

/**
 * Gets an jobject jobject (which is a Java TestObject object), gets its jobject attribute "testObject2"
 * and gets its name, then returns it.
 */

    JNIEXPORT jstring JNICALL Java_hpktests_Main_getStringFromObject2 (JNIEnv *env, jobject this, jobject obj)
{
    //accessing TestObject obj and getting obj.testObject2
    jclass clazz = (*env)->GetObjectClass(env, obj); 
    jfieldID jID = (*env)->GetFieldID(env, clazz, "testObject2", "Lhpktests/TestObject2;");
    jobject obj2 = (*env)->GetObjectField (env, clazz, jID); 

    //accessing testObject2 and getting obj.testObject2.name
    jclass clazz2 = (*env)->GetObjectClass(env, obj2); 
    jmethodID jMID = (*env)->GetMethodID(env, clazz2, "getName", "(V)Ljava/lang/String;");
    jstring result =  (*env)->CallObjectMethod(env, obj2, jMID);

    return result;
}

为本机代码创建DLL等等不是问题,但是,当我在Java main方法中执行本机方法时,JVM会与ACCESS_VIOLATION_EXCEPTION崩溃。显然,我尝试获取TestObject2 testObject2的字段ID的前半部分中的行是有问题的。我知道非易映射(即原始数据类型,如int,short等)数据类型的语法是

JVM_Pointer->getFieldID(<JVM>, <jclass that has the field one is looking for>, <"Name_of_field">, <"Lpackage/classname;">);

(*env)->getFieldID(env, myClass, "stringField", "Ljava/lang/String;");

但它不适用于我的情况,其中包名为“hpktests”。 有什么想法可以说明问题的原因是什么?

0 个答案:

没有答案