【问题标题】:Java to C object passingJava 到 C 对象的传递
【发布时间】:2012-08-24 13:59:11
【问题描述】:

我有调用内核模块的 C 代码,我想将结构传递给它。这似乎是可行的前 - char device catch multiple (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;
};

我应该如何处理?

【问题讨论】:

  • 你必须传递给内核模块的C结构被java端填满了?
  • 是的,我认为这很容易,不是吗?而不是将数据传递给 C 并创建结构?
  • 知道如何从传递的对象中获取结构吗?

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


【解决方案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了解更多详情。

【讨论】:

  • 我的对象有一个int数组和一个int那怎么办?
  • @kani 我更新了我的答案以显示如何获取整数字段。获取数组并不复杂。浏览文档 - 一切都在那里。请不要指望别人为你做这件事。
  • Thakz Aleks G :) 现在这个例子看起来很简单。是否可以将对象映射到结构? (我的意思是不访问对象字段)
  • @kani 不,您不能将对象“映射”到结构。您可以检索所有字段并在 C 中创建 struct 以使您的生活更轻松,但您需要使用 JNI 函数检索每个字段的值。
  • @kani 你需要使用JNI函数GetArrayLength来确定数组的长度;那么你可以在声明你的结构时使用结果。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2019-05-23
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2017-06-28
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多