我正在参与一个构建Android应用程序的项目,负责C++方面的工作。有一些信息(通过字符串和字符串数组)需要传递给Java应用程序(通过JNI)。我以前从未做过这个,而反向工作的人没有C ++经验,并承认他们无法提供真正的帮助。
我找到了以下代码(来自这里)
但对我来说这毫无意义。我不确定应该如何将其纳入程序的C++部分,也无法理解它的工作原理。代码是在
理想情况下,我希望字符串/字符串数组能够实时地以行形式发送,而不是在函数结尾处发送,以便我无需添加新函数。
我找到的代码是否可以实现我想要的功能(稍加改编)?我想要的东西是否可能?如果是,我该怎么做呢?
编辑/更新: 今天整天我一直在研究JNI和术语,我认为我没有正确地传达我在此处和在@jogabonito的答案/回复中所要实现的目标。
话虽如此,我正在开发的代码是用于IM客户端的,它需要将消息和存在更新推送到Android Java应用程序(通过JNI),以便 Android 应用程序不需要轮询来获取更新。我已经学会了如何设置Java代码调用请求信息的函数。但是,当信息到达时,我不知道如何将新的消息或存在信息(jabber stanza字符串)推送到Java代码中去。所有我看到的关于如何做到这一点的代码(例如下面的代码)似乎都需要从Java代码(env、class、methodid等)中获取信息。
当不是Java代码调用函数而是我的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++部分,也无法理解它的工作原理。代码是在
return(ret);
一行执行时发送消息吗?还是在for循环内执行的那一行?理想情况下,我希望字符串/字符串数组能够实时地以行形式发送,而不是在函数结尾处发送,以便我无需添加新函数。
我找到的代码是否可以实现我想要的功能(稍加改编)?我想要的东西是否可能?如果是,我该怎么做呢?
编辑/更新: 今天整天我一直在研究JNI和术语,我认为我没有正确地传达我在此处和在@jogabonito的答案/回复中所要实现的目标。
话虽如此,我正在开发的代码是用于IM客户端的,它需要将消息和存在更新推送到Android Java应用程序(通过JNI),以便 Android 应用程序不需要轮询来获取更新。我已经学会了如何设置Java代码调用请求信息的函数。但是,当信息到达时,我不知道如何将新的消息或存在信息(jabber stanza字符串)推送到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);
}
android
和android-ndk
标签,因为我认为这将帮助您更好地了解如何在 Android 上进行本地开发。 - Tim Bender