我有调用内核模块的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;
};
我应该怎样接近?
答案 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按名称获取字段的值。将字段本身传递给方法可能更容易,而不是传递对象。