如何通过JNI将哈希映射从Java发送到C

如何通过JNI将哈希映射从Java发送到C,java,c,java-native-interface,hashmap,Java,C,Java Native Interface,Hashmap,我有一个对象,它有一个HashMap字段。当对象传递给C时,如何访问该字段 对象的类具有以下字段: private String hello; private Map<String, String> params = new HashMap<String, String>(); 私有字符串hello; private Map params=new HashMap(); 你的问题的答案可以归结为为什么你想把映射传递给C,而不是用Java迭代你的映射,然后把内容传递给C。但

我有一个
对象
,它有一个
HashMap
字段。当
对象
传递给C时,如何访问该字段

对象
具有以下字段:

private String hello;
private Map<String, String> params = new HashMap<String, String>();
私有字符串hello;
private Map params=new HashMap();

你的问题的答案可以归结为为什么你想把
映射
传递给C,而不是用Java迭代你的
映射
,然后把内容传递给C。但是,我该问谁为什么呢

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

容器对象:

公共类容器{
私人字符串你好;
私有映射参数Map=newhashmap();
公共映射getParameterMap(){
返回参数map;
}
}
将容器传递给JNI的主类:

公共类MyClazz{
公共数据处理(){
容器=新容器();
container.getParameterMap().put(“foo”,“bar”);
机械地图(集装箱);
}
公共本机void操纵器映射(容器);
}
相关C功能:

JNIEXPORT jint JNICALL Java\u MyClazz\u操纵映射(JNIEnv*env、jobject自引用、jobject jContainer){
//初始化容器类
jclass c_容器=(*env)->GetObjectClass(env,jContainer);
//初始化容器类的Get参数映射方法
jmethodID m_GetParameterMap=(*env)->GetMethodID(env,c_容器,“GetParameterMap”,“()Ljava/util/Map;”;
//调用所述方法将参数映射存储在jParameterMap中
jobject jParameterMap=(*env)->CallObjectMethod(env,jContainer,m_GetParameterMap);
//初始化映射接口
jclass c_Map=env->FindClass(“java/util/Map”);
//初始化Map的Get Size方法
jmethodID m_GetSize=(*env)->GetMethodID(env,c_-Map,“size”,“I”);
//获取大小并将其存储在jSize中;jSize的值应为1
intjsize=(*env)->CallIntMethod(env,jParameterMap,m_GetSize);
//在这里定义您需要的其他方法。
}

注意,我并不热衷于在方法本身中初始化methodid和类;向您展示如何缓存它们以供重用。

基本上,您可以像传递任何其他对象一样传递它。但是要从C访问它,你需要调用类的Java方法。是的,我找到了一个从Java到C的所有复杂对象转换的通用解决方案,非常感谢:-)从JNI调用hashmap方法效率低吗?我想将属性对象从java传递到JNI层。一个想法是直接从JNI调用properties对象的方法,另一个想法是将属性映射转换为java层中的键和值数组,并将数组传递给JNI本机方法。哪一个是有效的?或者我能考虑其他的方法吗?