2

我有调用内核模块的 C 代码,我想将结构传递给它。这似乎是可行的前 字符设备捕获多个(int)ioctl-arguments

但是我正在通过 java JNI 调用 c 代码。据说 C 结构映射是到 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;
};

我应该如何接近?

4

2 回答 2

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 规范以获取更多详细信息。

于 2012-08-24T14:10:25.397 回答
0

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

于 2012-08-24T14:01:55.207 回答