Я работаю на стороне С++ проекта, который создает приложение для Android. Есть некоторая информация (через строки и массивы строк ), которую мне нужно передать в приложение Java (через JNI ). Я никогда раньше этим не занимался, а люди, работающие в обратном направлении, не имеют опыта работы с C++ и признают, что особо помочь не могут.
Я нашел следующий код (из здесь)
#include
#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);
? Или во время выполнения строки в цикле for?
В идеале я хотел бы, чтобы массив строк/строк отправлялся «вживую» в строке, а не в конце функции, чтобы мне не приходилось включать новую функцию.
Будет ли код, который я нашел, работать для того, что я хочу (с некоторой адаптацией )? Возможно ли то, что я ищу? Если да, то как я могу это сделать?
РЕДАКТИРОВАТЬ/ОБНОВИТЬ: Потратив день на изучение JNI и терминологии, я думаю, что мне не удалось правильно передать то, чего я хочу достичь, как здесь, так и в качестве комментария к ответу / ответу @jogabonito.
Что, как говорится. Код, над которым я работаю, предназначен для клиента обмена мгновенными сообщениями, которому необходимо отправлять сообщения и обновления присутствия в Java-приложение Android (через JNI ), чтобы приложение Android не запрашивало обновления. Мне удалось узнать, как настроить функции для java-кода для вызова запрашиваемой информации. Однако,Я понятия не имею, как передавать новое сообщение или информацию о присутствии (строки строфы jabber )в код Java, когда он приходит. Весь код, который я видел о том, как это сделать (, см. ниже для пример ), по-видимому, требует получения информации из кода Java (env, class, methodid и т. д. ).
Для меня не имеет смысла, как это должно быть возможно, когда не код Java вызывает функцию, а мой код С++. Любое объяснение/помощь будут очень признательны.
#include
#include
#include
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's a tutorial :)
printf("%s\n", str);
return (*env)->NewStringUTF(env, str);
}