将 JNI -> jobject(基本上是 java 文件中的映射和/或映射的映射)转换为 std::map(c++)



我在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 本机方法,任何人都可以建议标准方法来做同样的事情吗?提前谢谢。

我们在C++/Java集成方面做了很多工作。跨边界传递复杂数据结构的问题在于,您必须封送方法调用,这可能是一个非常复杂且容易出错的工作。 我发现做这样的事情要容易得多:

  • 在 Java 端,使用 gson 或 jackson 将映射序列化为 JSON
  • 跨边界传递 JSON 字符串
  • 在C++端将 JSON 反序列化为 std::map

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

这需要一点点挣扎。看看这里:

http://jnicookbook.owsiak.org/recipe-No-020/

另外,请在此处查看与将 Map 传递到本机代码相关的示例

https://github.com/mkowsiak/jnicookbook/tree/master/recipes/recipeNo037https://github.com/mkowsiak/jnicookbook/tree/master/recipes/recipeNo038

您可以使用

scapix::link::java C++ JNI 库自动在许多C++和 Java 类型之间进行转换。下面是一个示例:

#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();
}

相关内容

  • 没有找到相关文章

最新更新