Конвертировать JNI -> jobject (в основном map и / или map of map в java-файле) в std :: map (c ++) - PullRequest
0 голосов
/ 18 января 2019

У меня есть собственный метод в Java-файле: -

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

После создания файла заголовка из Java, карта преобразуется в задание в методе файла заголовка: -

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. Может ли кто-нибудь предложить стандартный подход для того же? Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 19 января 2019

Мы проделали большую работу с интеграцией C ++ / Java. Проблема с передачей сложных структур данных через границу заключается в том, что вам необходимо упорядочить вызовы методов, что может быть действительно сложным и подверженным ошибкам усилием. Я обнаружил, что гораздо проще сделать что-то вроде этого:

  • На стороне Java используйте gson или jackson для сериализации карты в JSON
  • Передать строку JSON через границу
  • На стороне C ++ десериализовать JSON в std :: map

Я не так хорошо знаком со стороной C ++, но вижу похожие проблемы, решаемые здесь

0 голосов
/ 13 марта 2019

Вы можете использовать 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();
}
0 голосов
/ 18 января 2019

Это потребует немного борьбы.Посмотрите здесь:

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

также посмотрите здесь примеры, связанные с передачей карты в собственный код

https://github.com/mkowsiak/jnicookbook/tree/master/recipeNo037 https://github.com/mkowsiak/jnicookbook/tree/master/recipeNo038

...