Java到C对象的传递

时间:2012-08-24 13:59:11

标签: java android struct java-native-interface ioctl

我有调用内核模块的C代码,我想将结构传递给它。这似乎可行 - 前 char device catch multiple (int) ioctl-arguments

但是我通过java JNI调用c代码。据说C struct mapping是Java对象。所以我将一个对象传递给C本机函数。

这是我的JNI c函数

  JNIEXPORT jint JNICALL Java_com_context_test_ModCallLib_reNice
  (JNIEnv *env, jclass clazz, jobject obj){

     // convert objcet to struct  
     // call module through IOCTL passing struct as the parameter
  }

我应该如何从obj获取结构?

编辑:这是我传递的对象,

class Nice{

    int[] pids;
    int niceVal;

    Nice(List<Integer> pID, int n){
        pids = new int[pID.size()];
        for (int i=0; i < pids.length; i++)
        {
            pids[i] = pID.get(i).intValue();
        }
        niceVal = n;
    }
}

我想要的结构就是这个,

struct mesg {
     int pids[size_of_pids];
     int niceVal;
};

我应该怎样接近?

2 个答案:

答案 0 :(得分:1)

您需要使用JNI方法来访问字段,例如:

//access field s in the object
jfieldID fid = (env)->GetFieldID(clazz, "s", "Ljava/lang/String;");
if (fid == NULL) {
    return; /* failed to find the field */
}

jstring jstr = (env)->GetObjectField(obj, fid);
jboolean iscopy;
const char *str = (env)->GetStringUTFChars(jstr, &iscopy);
if (str == NULL) {
    return; // usually this means out of memory
}

//use your string
...

(env)->ReleaseStringUTFChars(jstr, str);

...

//access integer field val in the object
jfieldID ifld = (env)->GetFieldID(clazz, "val", "I");
if (ifld == NULL) {
    return; /* failed to find the field */
}
jint ival = env->GetIntField(obj, ifld);
int value = (int)ival;

JNIEnv类中有成员函数可以执行任何操作:读取和修改类的成员变量,调用方法甚至创建新类。有关详细信息,请查看JNI Specifications

答案 1 :(得分:0)

您必须手动复制对象中的字段。您可以调用JNI methods按名称获取字段的值。将字段本身传递给方法可能更容易,而不是传递对象。