通过 JNI C++字符串发送到 Java
我正在一个构建Android应用程序的项目C++方面工作。有一些信息(通过字符串和字符串数组)我需要传递给Java应用程序(通过JNI)。我以前从未这样做过,在相反方向上工作的人没有C++的经验,并承认他们无法真正提供帮助。
我确实找到了以下代码(从这里)
#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);
}
但这对我来说毫无意义。大多数情况下,我不确定我应该如何将其纳入程序C++方面,并且我无法确切地理解它是如何工作的。代码是否在执行行时发送消息?还是在 for 循环内执行行期间?return(ret);
理想情况下,我希望字符串/字符串数组以“实时”方式发送,而不是在函数结束时发送,这样我就不必合并新函数。
我找到的代码是否适用于我想要的(经过一些调整)?我想要的东西是可能的吗?如果是这样,我该怎么做?
编辑/更新:我花了一天时间研究JNI和术语,我认为我未能正确传达我希望在这里实现的目标,并作为对@jogabonito的答案/回复的评论。
话虽如此。我正在处理的代码适用于IM客户端,该客户端需要将消息和状态更新推送到Android Java应用程序(通过JNI),以便Android应用程序不会轮询更新。我已经设法学会了如何设置java代码调用以请求信息的函数。但是,我不知道如何在新消息或状态信息(jabber节字符串)进入java代码时将其推送到java代码。我看到的所有关于如何执行此操作的代码(例如,请参阅下文)似乎都需要从java代码(env,class,methodid等)中获取信息。
对我来说,当这不是调用函数的java代码,而是我的c ++代码时,这应该如何成为可能,这对我来说是没有意义的。任何解释/帮助将不胜感激。
#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's a tutorial :)
printf("%s\n", str);
return (*env)->NewStringUTF(env, str);
}