EDITED 我从C调用java方法。以前尝试使用简单的数据类型如int代码工作正常,直到我决定使用实际的 java.util.Map 作为java方法的返回值。
jmethodID mid = env->GetStaticMethodID(clazz, "doProcess", "()Ljava/util/Map;");
现在,当我尝试使用以下语句来获取返回值
时jobject returnedValue = env->CallStaticObjectMethod(clazz, mid);
我甚至不确定CallStatic 对象方法和 jobject 是否是正确的类型。
我将地图声明为Map<String, String>
并希望每对都获得两个字符串值(键,值)。
我怎样才能从'jobject'类型中获取地图值?当我遍历地图并在循环中返回字符串时,我可能会成功。但我正在寻找一个可靠的解决方案,我可以将地图作为一个集合返回并分配到我的C ++地图结构或类似。 我需要每个键值对的值
答案 0 :(得分:1)
这很简单,只需要经过很多步骤。
假设我的Java代码中有这个方法:
@Url.Action("Remove", "List", new { httproute = "DefaultApi" })
然后我可以在我的C ++代码中执行此操作:
public class MainActivity extends AppCompatActivity {
...
public static Map<String, String> getTheMap() {
final Map<String, String> map = new HashMap<String, String>();
map.put("FooKey", "FooVal");
map.put("BarKey", "BarVal");
return map;
}
...
public native void convertMap();
}
我遗漏了任何错误处理。在生产代码中,你显然不应该这样做。
答案 1 :(得分:-1)
public class JNIDemo {
static {
System.loadLibrary("JNIDemo");
}
public static Map<String,String> getMap(){
Map<String,String> demo = new HashMap<String,String>();
demo.put("M","p");
return demo;
}
public native static void useMap();
}
JNIDemo.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class JNIDemo */
#ifndef _Included_JNIDemo
#define _Included_JNIDemo
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: JNIDemo
* Method: useMap
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_JNIDemo_useMap
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
JNIDemo.c
#include <jni.h>
#include <stdio.h>
#include "JNIDemo.h"
JNIEXPORT void JNICALL Java_JNIDemo_useMap(JNIEnv *env, jclass cls){
jmethodID getMap = (*env)->GetStaticMethodID(env, cls, "getMap", "()Ljava/util/Map;");
jobject jParameterMap = (*env)->CallStaticObjectMethod(env,cls, getMap);
jclass c_Map = (*env)-> FindClass(env,"java/util/Map");
jmethodID m_GetSize = (*env)->GetMethodID(env, c_Map, "size", "()I");
int jSize = (*env)->CallIntMethod(env, jParameterMap, m_GetSize);
printf("Size = %i\n", jSize );
return;
}