从 c/c++ 定义/实例化一个 java 对象
Posted
技术标签:
【中文标题】从 c/c++ 定义/实例化一个 java 对象【英文标题】:Define/Instantiate a java object from c/c++ 【发布时间】:2013-04-02 05:51:48 【问题描述】:我在 java 中的代码如下所示:
class MyClass
public void MyFunc(ISomeListener listener);
我想从一个 c++ 程序调用这个方法并将所需的参数传递给它。请注意,参数是接口的实现。因此我需要 define AND create 从 c++ 中创建 java 对象并将其传递给方法。我怎样才能做到这一点?
附言 如果有帮助,最初的问题是 java 程序是硬件的接口(如驱动程序)。我正在尝试从这个 java 代码创建一个 DLL,以便它可以用于任何语言。所以我想我会使用 C/C++ 包装代码,然后用它制作一个 DLL。
【问题讨论】:
在我看来,这种方法存在根本缺陷。除非通过 jni 使用了一些本机库,否则 Java 不能与硬件进行任何类型的低级接口。实现这一点的真正和通常的方法是将本地对应物包装在 java 中,而不是相反。您将 360 度返回起点。我不知道确切的问题,但看起来很奇怪。 You can call Java from C++ using JNI。我是否正确理解您想在 C++ 中实现 Java 接口,然后调用 Java 函数并将 C++ 实现传递给它?我想知道这是否可能。特别是考虑到 C++ 甚至没有接口。 @Yn5an3,你也许是对的。但是该应用程序已经实现了,重新实现它并不划算。 @Philipp,我已经使用了 JNI 并成功地从 C 运行了 java 代码。你理解正确,这就是为什么我在这里问这个问题,看看它是否可能(如何?)。 在您的 C++ 代码中直接使用与您的 Java 代码相同的本地库可能会更容易。 【参考方案1】:我通过在 java 中定义 Listener 类设法解决了这个问题。侦听器具有带有所需回调签名的本机方法。
public class MyImpl implements MyInterface
@override
public native int callback(int i);
使用 javac 编译。然后使用 javah 生成要与 JNI 一起使用的函数声明。在 C 程序中,我定义了函数并加载了 Impl 类,并使用 RegisterNatives 将回调注册到其中。
P.S.关于如何使用 JNI 实际定义类的问题仍未得到解答。
编辑: 使用这种方法有一个缺点。我将不得不在类范围而不是对象范围内注册回调。
【讨论】:
如果你想在运行时定义类,那么你可以使用JavaCompiler class。通过 JNI 调用它很简单;它只需要一些代码。最好预先定义所有需要的类并加载它们的 jar,而不是动态构建它们。以上是关于从 c/c++ 定义/实例化一个 java 对象的主要内容,如果未能解决你的问题,请参考以下文章
Java常识31 void 实例化对象后面带参数 实例变量(重点)多测师