Передать объект JSON в качестве аргумента в JNI для CPP и получить данные объектов JSON в CPP

Необходимо ввести данные из java-программы с использованием объекта класса, преобразовать его в объект json и передать на С++ через JNI. В С++, необходимо извлечь данные из объекта и сохранить их в файле.

Я не знаю, как отправлять и получать данные объекта json. Помогите мне с некоторыми простыми фрагментами кода!

class sample
{  

    public native void callCPP(JSONObject jo);    
    public static void main(String args[])
    {  
        int val = 7;  
        JSONObject jo = new JSONObject;  
        jo.put("val",val);

        sample s = new sample();
        s.callCPP(jo);  
    }  
}

и наоборот (отправка данных из cpp в java как JSONObject.

Извините, StackOverflow работает не так. Вопросы вида «Я хочу сделать X, пожалуйста, дайте мне совет и/или пример кода» считаются не по теме. Пожалуйста, посетите центр помощи и прочитайте Как спросить, и особенно прочитайте Почему «Кто-нибудь может мне помочь?» не актуальный вопрос?

Jim Garrison 19.06.2019 07:17

Проблема — это решение: JSON — это формат обмена данными! Просто сведите структуру данных к строке JSON, передайте ее через границу JNI и проанализируйте на другой стороне.

Botje 19.06.2019 08:46

Это то, что точно я не должен делать!!. я не должен передавать как строку s, я должен передавать как объект, извлекать из него данные и сохранять их .. @Botje

Siva Rahul 19.06.2019 08:58

Тогда я не понимаю вашего вопроса. Пожалуйста, добавьте код (желательно настоящий код, но подойдет и псевдокод).

Botje 19.06.2019 08:59

Это моя проблема, я не знаю, с чего начать. Скажите, можно ли передать json-объект в качестве аргумента в c++. @Botje.. Спасибо

Siva Rahul 19.06.2019 09:19

Не существует такого понятия, как «объект JSON». У вас либо есть строка, содержащая JSON, либо объект Java, имя которого бывает содержит «JSON». Если у вас есть последний, вы можете передать его через границу JNI и использовать JNI и обычные методы Java для взаимодействия с объектом. Конечно, это на порядок более болезненно, чем просто представить С++ строку JSON (сглаженную из вашего «объекта json») и заставить ее обрабатывать ее самостоятельно.

Botje 19.06.2019 09:20

Я добавил фрагмент кода. Я имею в виду этот объект json... Мне нужен доступ к val в CPP. @Ботье

Siva Rahul 19.06.2019 09:29

Это org.json.JSONObject? а javax.json.JSONObject? org.json.simple.JSONObject? Ответ одинаков для всех трех: узнайте, как получить доступ к val из Java и перенести его в JNI. Шаблон всегда один и тот же: FindClass чтобы получить определение класса, GetMethodID чтобы получить идентификатор нужного вам метода, Call{Type}Method чтобы вызвать его.

Botje 19.06.2019 09:33

можете ли вы объяснить это с помощью небольшого фрагмента кода, пожалуйста.. просто напечатайте val в С++. Заранее спасибо. @Botje

Siva Rahul 19.06.2019 09:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
9
1 336
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предполагая, что вы имели в виду org.json.JSONObject:

void Java_sample_callCPP(JNIEnv *env, jobject obj, jobject arg) {
    // This code calls arg->getInt("val"), assuming it is a org.json.JSONObject
    jclass cls = env->FindClass("org/json/JSONObject"); // alternatively: env->GetObjectClass(arg);
    jmethodID method = env->GetMethodID(cls, "getInt", "(Ljava/lang/String;)I"); // int getInt(java.lang.String key)
    jint val = env->CallIntMethod(arg, method, env->NewStringUTF("val"));
    std::cout << "val: " << val << std::endl;

    jmethodId method2 = env->GetMethodID(cls, "getString", "(Ljava/lang/String;)Ljava/lang/String;");
    jstring strVal = (jstring) env->CallObjectMethod(arg, method2, env->NewStringUTF("strVal"));

    // Make a copy of the returned Java string. We need to release the pointer again, too.
    const jchar *ptr = env->GetStringUTFChars(strVal, nullptr);
    std::string strVal_copy(ptr);
    env->ReleaseStringUTFChars(strVal, ptr);
    std::cout << "strVal: " << strVal_copy << std::endl;
}

Спасибо, но я не должен использовать метод обратного вызова. Потому что у меня большой диапазон атрибутов.. Я не могу каждый раз использовать метод для каждой переменной. Более того, при чем здесь JSONObject?

Siva Rahul 19.06.2019 09:52

Какая из этих строк кода, по вашему мнению, использует «метод обратного вызова»? И почему проблематично использовать методы JNI для доступа к свойствам? Это именно то, что вы спросили! Если вы этого не хотите, вам нужно сериализовать свои объекты на стороне java и десериализовать на стороне C++. Затем вы можете использовать собственные методы C++ для проверки вашего объекта C++.

Botje 19.06.2019 09:57

Извините, если я ошибаюсь .. Пожалуйста, скажите мне, как это сделать!

Siva Rahul 19.06.2019 10:00

Как сделать что? Вы спросили, как использовать JNI для проверки объекта Java, я ответил. Существует Другого пути нет для доступа к объекту Java из C++.

Botje 19.06.2019 10:02

Спасибо, приятель. Вы мне очень помогли!.. Упомянутый вами метод отлично работает для меня!! еще раз спасибо.. Но не могли бы вы сказать мне, как получить строку в этом, пожалуйста..

Siva Rahul 19.06.2019 10:10

Обновил мой ответ. См. также пример кулинарной книги JNI

Botje 19.06.2019 10:40

Если это решит вашу проблему, отметьте вопрос как принятый.

Botje 19.06.2019 10:41

Эй, Ботье, могу я попросить тебя об еще одной услуге? можете ли вы показать мне, как сделать прямо противоположное этому, например, сохранить объекты класса в JSONObject из С++ и вернуть их в Java. Пожалуйста

Siva Rahul 20.06.2019 10:53

Stack Overflow не является сервисом для написания кода. Кроме того, это другой вопрос, хотя и тесно связанный с этот образец поваренной книги JNI, который передает map<int, int> на Java.

Botje 20.06.2019 13:07

на самом деле я пытался использовать карту, вектор и т. д., но он всегда говорит, что «% 1 не является допустимым приложением win32», поэтому теперь я вынужден работать над этим. Пожалуйста, помогите мне, у меня есть группа данных в файле, я должен получить ее и передать как JSONObject в java (или любой подобный метод), как вы использовали getInt , и распечатать ее там. Пожалуйста помогите. @Ботье

Siva Rahul 21.06.2019 07:59

Разместите новый вопрос и показать свою работу. Пример, который я связал, показывает, как построить HashMap и заполнить его значениями. Прочтите его и адаптируйте к org.json.JSONObject.

Botje 21.06.2019 09:36

Пока вы ждете, прочтите stackoverflow.com/help/asking-rate-limited и stackoverflow.com/help/как спросить, чтобы людям не приходилось выпытывать у вас важные подробности в комментариях к вашему следующему вопросу.

Botje 21.06.2019 11:54

Другие вопросы по теме