【问题标题】:How to send a HashMap from Java to C via JNI如何通过 JNI 将 HashMap 从 Java 发送到 C
【发布时间】:2013-06-05 22:21:57
【问题描述】:

我有一个Object,其中有一个HashMap 字段。当Object 传递给C 时,如何访问该字段?

ObjectClass 具有以下字段:

private String hello;
private Map<String, String> params = new HashMap<String, String>();

【问题讨论】:

  • 基本上,您可以像传递任何其他对象一样传递它。但是要从 C 中访问它,您需要调用该类的 Java 方法。

标签: java c java-native-interface hashmap


【解决方案1】:

你的问题的答案真的归结为为什么你想将Map传递给C而不是在Java中迭代你的Map并将内容传递给C。但是,我是谁来质疑为什么?

您问如何访问HashMap(在您提供的代码中,Map)字段?在 Java 中为其编写访问器方法,并在传递容器 Object 时从 C 中调用该访问器方法。下面是一些简单的示例代码,展示了如何将 Map 从 Java 传递到 C,以及如何访问 Mapsize() 方法。从中,您应该能够推断出如何调用其他方法。

容器对象:

public class Container {

    private String hello;
    private Map<String, String> parameterMap = new HashMap<String, String>();

    public Map<String, String> getParameterMap() {
        return parameterMap;
    }
}

将容器传递给 JNI 的主类:

public class MyClazz {

    public doProcess() {

        Container container = new Container();
        container.getParameterMap().put("foo","bar");

        manipulateMap(container);
    }

    public native void manipulateMap(Container container);
}

相关C函数:

JNIEXPORT jint JNICALL Java_MyClazz_manipulateMap(JNIEnv *env, jobject selfReference, jobject jContainer) {

    // initialize the Container class
    jclass c_Container = (*env)->GetObjectClass(env, jContainer);

    // initialize the Get Parameter Map method of the Container class
    jmethodID m_GetParameterMap = (*env)->GetMethodID(env, c_Container, "getParameterMap", "()Ljava/util/Map;");

    // call said method to store the parameter map in jParameterMap
    jobject jParameterMap =  (*env)->CallObjectMethod(env, jContainer, m_GetParameterMap);

    // initialize the Map interface
    jclass c_Map = env->FindClass("java/util/Map");

    // initialize the Get Size method of Map
    jmethodID m_GetSize = (*env)->GetMethodID(env, c_Map, "size", "()I");

    // Get the Size and store it in jSize; the value of jSize should be 1
    int jSize = (*env)->CallIntMethod(env, jParameterMap, m_GetSize);

    // define other methods you need here.
}

值得注意的是,我并不热衷于在方法本身中初始化 methodID 和类; this SO Answer 向您展示如何缓存它们以供重复使用。

【讨论】:

  • 是的,我已经为所有从 Java 到 C 的复杂对象转换找到了一个通用的解决方案,非常感谢 :-)
  • 从 JNI 调用 hashmap 方法效率低吗?我想将一个属性对象从 java 传递到 JNI 层。一种思路是直接从JNI调用properties对象的方法,另一种思路是将properties Map转换为java层的key和value数组,并将数组传递给JNI原生方法。哪一个是高效的?或者有什么我可以考虑的替代方法吗?
猜你喜欢
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多