Отправить строку C++ в Java через JNI

Я работаю на стороне С++ проекта, который создает приложение для 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);
}

17
задан AeroBuffalo 24 July 2012 в 21:25
поделиться