JNI:使用什么类型的CallStaticMethod?

时间:2017-05-31 06:06:17

标签: java c++ java-native-interface

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 ++地图结构或类似。 我需要每个键值对的值

2 个答案:

答案 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;
    }