【问题标题】:Convert JNI -> jobject (basically map and/or map of map in java file) to std::map(c++)将 JNI -> jobject(基本上是映射和/或 java 文件中的映射)转换为 std::map(c++)
【发布时间】:2019-01-18 07:36:19
【问题描述】:

我在 java 文件中有一个本地方法:-

class JNITest{
    public native void test(String param1, Map<String, Number> param2, Map<String, Map<String, Double>> param3)
}

从java生成头文件后,map转换为头文件方法中的jobject:-

JNIEXPORT void JNICALL Java_com_jni_JNITest_test
(JNIEnv *env,
jobject self,
jstring param1,
jobject param2,
jobject param3) { }

我在 cpp 中有一个本地方法:

int cpp_native(
std::string param1,
std::map<std::string, float>& param2,
std::map<std::string, std::map<std::string, float> >& param3) { }

问:- 我需要将 Jobject 转换回 std::map(cpp) 以将其传递给 cpp 本机方法,有人可以建议标准方法来做同样的事情吗? 提前致谢。

【问题讨论】:

  • 您可以尝试使用 JavaCPP 从 Java 访问 std::map:github.com/bytedeco/javacpp 如果您有兴趣,请告诉我,我可以提供一些示例代码作为答案。

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


【解决方案1】:

我们在 C++/Java 集成方面做了大量工作。跨边界传递复杂数据结构的问题是您必须编组方法调用,这可能是一项非常复杂且容易出错的工作。我发现这样做更容易:

  • 在 Java 端,使用 gson 或 jackson 将您的地图序列化为 JSON
  • 越界传递 JSON 字符串
  • 在 C++ 端将 JSON 反序列化为 std::map

我对 C++ 方面不太熟悉,但我看到类似的问题正在解决here

【讨论】:

    【解决方案2】:

    【讨论】:

      【解决方案3】:

      您可以使用scapix::link::java C++ JNI 库在许多 C++ 和 Java 类型之间进行自动转换。这是example

      #include <scapix/java_api/java/lang/System.h>
      #include <scapix/java_api/java/util/Locale.h>
      #include <scapix/java_api/java/text/DateFormatSymbols.h>
      
      using namespace scapix::link::java;
      using namespace scapix::java_api;
      
      void test1()
      {
          // C++ objects are automatically converted to and from corresponding Java types.
          // This works for any type supported by scapix::link::java::convert() interface,
          // which supports many STL types and can be extended for your own types.
      
          std::string version = java::lang::System::getProperty("java.version");
          std::vector<std::string> languages = java::util::Locale::getISOLanguages();
          std::vector<std::vector<std::string>> zone_strings = java::text::DateFormatSymbols::getInstance()->getZoneStrings();
          std::map<std::string, std::string> properties = java::lang::System::getProperties();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多