Необходимо ввести данные из 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.
Проблема — это решение: JSON — это формат обмена данными! Просто сведите структуру данных к строке JSON, передайте ее через границу JNI и проанализируйте на другой стороне.
Это то, что точно я не должен делать!!. я не должен передавать как строку s, я должен передавать как объект, извлекать из него данные и сохранять их .. @Botje
Тогда я не понимаю вашего вопроса. Пожалуйста, добавьте код (желательно настоящий код, но подойдет и псевдокод).
Это моя проблема, я не знаю, с чего начать. Скажите, можно ли передать json-объект в качестве аргумента в c++. @Botje.. Спасибо
Не существует такого понятия, как «объект JSON». У вас либо есть строка, содержащая JSON, либо объект Java, имя которого бывает содержит «JSON». Если у вас есть последний, вы можете передать его через границу JNI и использовать JNI и обычные методы Java для взаимодействия с объектом. Конечно, это на порядок более болезненно, чем просто представить С++ строку JSON (сглаженную из вашего «объекта json») и заставить ее обрабатывать ее самостоятельно.
Я добавил фрагмент кода. Я имею в виду этот объект json... Мне нужен доступ к val в CPP. @Ботье
Это org.json.JSONObject? а javax.json.JSONObject? org.json.simple.JSONObject? Ответ одинаков для всех трех: узнайте, как получить доступ к val из Java и перенести его в JNI. Шаблон всегда один и тот же: FindClass чтобы получить определение класса, GetMethodID чтобы получить идентификатор нужного вам метода, Call{Type}Method чтобы вызвать его.
можете ли вы объяснить это с помощью небольшого фрагмента кода, пожалуйста.. просто напечатайте val в С++. Заранее спасибо. @Botje





Предполагая, что вы имели в виду 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?
Какая из этих строк кода, по вашему мнению, использует «метод обратного вызова»? И почему проблематично использовать методы JNI для доступа к свойствам? Это именно то, что вы спросили! Если вы этого не хотите, вам нужно сериализовать свои объекты на стороне java и десериализовать на стороне C++. Затем вы можете использовать собственные методы C++ для проверки вашего объекта C++.
Извините, если я ошибаюсь .. Пожалуйста, скажите мне, как это сделать!
Как сделать что? Вы спросили, как использовать JNI для проверки объекта Java, я ответил. Существует Другого пути нет для доступа к объекту Java из C++.
Спасибо, приятель. Вы мне очень помогли!.. Упомянутый вами метод отлично работает для меня!! еще раз спасибо.. Но не могли бы вы сказать мне, как получить строку в этом, пожалуйста..
Обновил мой ответ. См. также пример кулинарной книги JNI
Если это решит вашу проблему, отметьте вопрос как принятый.
Эй, Ботье, могу я попросить тебя об еще одной услуге? можете ли вы показать мне, как сделать прямо противоположное этому, например, сохранить объекты класса в JSONObject из С++ и вернуть их в Java. Пожалуйста
Stack Overflow не является сервисом для написания кода. Кроме того, это другой вопрос, хотя и тесно связанный с этот образец поваренной книги JNI, который передает map<int, int> на Java.
на самом деле я пытался использовать карту, вектор и т. д., но он всегда говорит, что «% 1 не является допустимым приложением win32», поэтому теперь я вынужден работать над этим. Пожалуйста, помогите мне, у меня есть группа данных в файле, я должен получить ее и передать как JSONObject в java (или любой подобный метод), как вы использовали getInt , и распечатать ее там. Пожалуйста помогите. @Ботье
Разместите новый вопрос и показать свою работу. Пример, который я связал, показывает, как построить HashMap и заполнить его значениями. Прочтите его и адаптируйте к org.json.JSONObject.
Пока вы ждете, прочтите stackoverflow.com/help/asking-rate-limited и stackoverflow.com/help/как спросить, чтобы людям не приходилось выпытывать у вас важные подробности в комментариях к вашему следующему вопросу.
Извините, StackOverflow работает не так. Вопросы вида «Я хочу сделать X, пожалуйста, дайте мне совет и/или пример кода» считаются не по теме. Пожалуйста, посетите центр помощи и прочитайте Как спросить, и особенно прочитайте Почему «Кто-нибудь может мне помочь?» не актуальный вопрос?