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

通过JNI将C ++类返回Java

谷越
2023-03-14
问题内容

我目前在一个项目中同时使用C 和Java,并且希望能够将包含在C

中的对象发送到我的Java接口,以便通过GUI对其进行修改,然后将所做的修改发送回C ++中。

到目前为止,我一直没有通过JNI接口向Java返回int或boolean值。这次我必须通过接口发送对象。我已经在C ++和Java中提供了类似的类定义。
我想知道如何创建对象,以便可以在Java中使用它。

在C ++中,我有:

JNIEXPORT MyObject JNICALL Java_ca_X_Y_Z_C_1getMyObject(JNIEnv* env, jclass, jint number);

Java会调用此函数,以便从C ++端获取对象(对象包含在一个单例中,易于访问)。

在Java端,我对此方法做了一个简单的调用,

MyObject anObject = C_getMyObject(3);

这应该返回我新创建的对象。

当我进行实际的调用时,Java当前向我返回UnsatisfiedLinkError。怎么了?


问题答案:

这是我选择使用的解决方案:

首先,我将在Java中创建一个类似的对象。然后,从C ++实例化它,并将所有值传递给它。

(C++)
clazz = env->FindClass("java/lang/Integer");
jmethodID method = env->GetMethodID(clazz, "<init>", "(I)V");
return env->NewObject(clazz, method, (jint)anInteger);

但是后来我意识到这不是很方便,并且有点太复杂了。

相反,我决定返回一个Java将解析并用于初始化对象的字符串。

(JAVA)
String aString = "valuesoftheobject";
MyObject myObject(aString);

MyObject将有一个采用字符串的构造函数。我相信解决方案简单有效。



 类似资料:
  • 本文向大家介绍Android 通过jni返回Mat数据类型方法,包括了Android 通过jni返回Mat数据类型方法的使用技巧和注意事项,需要的朋友参考一下 Android 开发过程中为了实现代码的高效性,通常要调用本地c++代码,JNI是java语言提供的和c/c++相互沟通的机制,在使用opencv做图像处理时,通常要调用c/c++代码进行相关操作,将处理后的结果返回java进行显示或者其他

  • 我想用JNI编写一个函数,如下所示: (JNIEnv*jenv,jclass,jstring文件输入,jobject mat) Java接口将是: 现在我想将Mat传递给JNI并更改其值。 有人能给我一个教程或指南吗?特别是如何使用j对象。

  • 问题内容: 我正在构建Android应用程序的项目的C 方面。我需要一些信息(通过字符串和字符串数组)传递给Java应用程序(通过JNI)。我以前从未做过,相反方向的人没有C 的经验,并承认他们不能真正提供帮助。 我确实找到了以下代码(从这里开始) 但这对我来说毫无意义。通常,我不确定如何将其合并到程序的C ++端,而且我无法确切了解其工作原理。代码是否在执行该行时发出消息?还是在for循环中执行

  • 问题内容: 我发现了大量有关如何在JNI中生成2D基本数组并将其返回给Java的文档。但是这些信息无法描述如何在 C中* 为上下文传递 已存在的 2D浮点数组(float **)。 * 为了明确描述我的问题,我将添加一些我想实现的 C 伪代码: 考虑到我无法找到任何描述这种情况的信息,我认为这不是直截了当的。 感谢您提供任何有用的信息。 问题答案: 感谢Timo的帮助和链接。为了后代,我添加了一个

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

  • 问题内容: 我正在尝试使用android NDK。 有没有办法将在JNI中创建的数组(以我的情况为例)返回给Java?如果是这样,请提供一个可以执行此操作的JNI函数的简单示例。 问题答案: 如果你已经阅读了文档,但仍然有一些问题应作为最初问题的一部分。在这种情况下,示例中的JNI函数将创建多个数组。外部数组由使用JNI函数创建的“对象”数组组成。从JNI的角度来看,这就是一个二维数组,即一个包含