Я работаю на стороне С++ проекта, который создает приложение для Android. Существует некоторая информация (через строки и строковые массивы), которые мне нужно передать в приложение Java (через JNI). Я никогда не делал этого раньше, и люди, работающие в обратном направлении, не имеют опыта работы с С++ и признают, что они действительно не могут помочь.
Я нашел следующий код (от здесь)
#include <jni.h>
#include "ArrayHandler.h"
JNIEXPORT jobjectArray JNICALL Java_ArrayHandler_returnArray (JNIEnv *env, jobject jobj){
jobjectArray ret;
int i;
char *message[5]= {"first","second","third","fourth","fifth"};
ret= (jobjectArray)env->NewObjectArray(5,env->FindClass("java/lang/String"),env->NewStringUTF(""));
for(i=0;i<5;i++) {
env->SetObjectArrayElement(ret,i,env->NewStringUTF(message[i]));
}
return(ret);
}
Но для меня это не имеет смысла. В основном, я не уверен, как я должен включить это в сторону С++ программы, и я не понимаю, как это работает. Является ли код отправлением сообщения после выполнения строки return(ret);
? Или во время выполнения строки внутри цикла?
В идеале я хотел бы, чтобы массив строк/строк был отправлен "вживую" в строке, а не в конце функции, так что мне не нужно включать новую функцию.
Будет ли код, который я нашел, работать для того, что я хочу (с некоторой адаптацией)? Является ли то, что я ищу, даже возможно? Если да, то как я могу это сделать?
EDIT/UPDATE: Проведя день, изучая JNI и терминологию, я думаю, что мне не удалось правильно сообщить, что я ищу, чтобы достичь как здесь, так и в качестве комментария к ответу/ответу @jogabonito.
Это сказано. Код, над которым я работаю, предназначен для IM-клиента, который должен будет передавать обновления сообщений и присутствия в приложение Java java (через JNI), чтобы приложение Android не проводило опрос на наличие обновлений. Мне удалось узнать, как настроить функции для java-кода для вызова более подробной информации. Тем не менее, я не знаю, как направить новую информацию о сообщениях или присутствии (строки jabber stanza) в код Java, когда она приходит. Весь код, который я видел, как это сделать (см. Ниже, например), кажется, требуется получить информацию из java-кода (env, class, methodid и т.д.).
Мне не кажется, что это возможно, если это не код Java, вызывающий функцию, а мой код на С++. Любое объяснение/помощь будет очень оценено.
#include <string.h>
#include <stdio.h>
#include <jni.h>
jstring Java_the_package_MainActivity_getJniString( JNIEnv* env, jobject obj){
jstring jstr = (*env)->NewStringUTF(env, "This comes from jni.");
jclass clazz = (*env)->FindClass(env, "com/inceptix/android/t3d/MainActivity");
jmethodID messageMe = (*env)->GetMethodID(env, clazz, "messageMe", "(Ljava/lang/String;)Ljava/lang/String;");
jobject result = (*env)->CallObjectMethod(env, obj, messageMe, jstr);
const char* str = (*env)->GetStringUTFChars(env,(jstring) result, NULL); // should be released but what a heck, it a tutorial :)
printf("%s\n", str);
return (*env)->NewStringUTF(env, str);
}