当前位置: 首页 > 面试题库 >

通过JNI将C ++字符串发送到Java

贺立果
2023-03-14
问题内容

我正在构建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
++端,而且我无法确切了解其工作原理。代码是否在执行该return(ret);行时发出消息?还是在for循环中执行该行期间?

理想情况下,我希望将字符串/字符串数组“实时”发送到行中,而不是在函数末尾发送,这样我就不必合并新函数。

我找到的代码可以为我想要的工作(经过一些修改)吗?我正在寻找的东西甚至可能吗?如果是这样,我该怎么办?

编辑/更新: 花了整整一天时间研究JNI和术语,我想我未能正确传达我在这里想要实现的目标以及对@jogabonito的回答/答复的评论。

话虽如此。我正在处理的代码是针对IM客户端的,该客户端需要将消息和状态更新推送到Android
Java应用程序(通过JNI),以便Android应用程序不会轮询更新。我设法学习了如何设置Java代码的函数来调用requrest信息。但是,我不知道如何在传入新消息或状态信息(Jabber节字符串)时将其推送到Java代码。我在如何执行此操作时所见过的所有代码(例如,参见下文)似乎都需要从Java代码中获取信息(env,类,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);
}

问题答案:

在您共享的函数中,在C
代码中,您正在使用创建对象数组 NewObjectArray。然后在for循环中,您将使用创建一个字符串 NewStringUTF并将其存储在数组的索引中 SetObjectArrayElement。到目前为止,您的对象数组仅对您的c
代码有效,对您的Java代码未知。只有当您返回它时,您的Java应用程序才能访问它。
我可以想到几种将字符串从c ++发送到java的方法,尽管它可能与您的意图不符。

  1. 将String数组传递给您的本机函数。在您的本机代码中,您可以使用访问每个元素,GetObjectArrayElement并使用进行更新SetObjectArrayElement。这可能毫无意义,因为您最终不得不调用一个我认为您不想要的函数。

  2. 如果您已经在Java代码中将字符串定义为字段,则可以使用GetFieldID和从本机访问该字符串GetObjectField,然后可以使用对其进行更新SetObjectField。我不知道您将如何向Java代码发出该字段已更新的信号(如果您需要的话)

编辑
您编写的更新函数旨在从Java层调用。提示是该函数的名称Java_the_package_MainActivity_getJniString。要从本机上下文调用Java代码,您将需要对envand的引用obj



 类似资料:
  • 问题内容: 我的Java应用程序使用JNI调用用C编写的库。此本地库将错误记录到stderr,但是我想以某种方式通过我的log4j记录器重定向错误流。这可能吗? C库是外部的-我没有源,所以无法更改它。 谢谢 问题答案: 注意:我尚未尝试此答案;YMMV。 POSIX方法将更改与流关联的基础文件。如联机帮助页所述:“ freopen()函数的主要用途是更改与标准文本流(stderr,stdin或s

  • 我有一个exe文件,可以像这样从cmd运行: 我想从java发送这个命令。我知道我可以这样使用ProcessBuilder: 但我不知道如何通过管道将字符串文本发送到此命令。如果可能的话,我更喜欢不创建文本.txt文件的解决方案。

  • 问题内容: 我有两个脚本,Server.py和Client.py。我有两个目标: 为了能够一次又一次地从客户端向服务器发送数据。 为了能够将数据从服务器发送到客户端。 这是我的Server.py: 这是我的客户: 该函数首次运行(“ e”进入服务器,我返回返回消息),但是如何使它一遍又一遍地发生(类似于聊天应用程序)?该问题在第一次之后开始。消息不会在第一次之后发送。我究竟做错了什么?我是pyth

  • 我正在尝试使用JNI将一个图像从C++发送到java。该图像是一个用C++创建的位图,其中我使用将像素转换为一个。当使用C++将图像保存到文件中时,没有任何问题,但是当将像素发送到Java时,图像会变得模糊。JavaDocs说我必须使用来实现BufferedImage,但我觉得压缩中有问题 C++位图 这是图像的结果

  • 目前,我正在通过外部URL检索数据,该URL使用PHP脚本并返回JSON值。工作很好。 但如何发送用于查询的字符串,以便在PHP脚本中执行以下操作: 注意:我不想使用凌空抽射。 我的AsyncTask扩展类,它当前不向URL发送任何值。

  • 问题内容: 我有一个字符串数组一样,我想这个数组发送到 ç 使用 JNI 。我找不到任何明确的解决方案。我试图将此字符串视为成功,但没有成功。 有没有办法做到这一点? 问题答案: 您可以编写一个简单的函数,该函数接受一个对象,将每个对象强制转换为jstring,然后对其进行调用。 像这样: