是否可以使用 JNI 在 C 或 C++ 中实现 Java 接口
Is it possible to implement a Java Interface in C or C++ using JNI?
假设一个包含类的Java库,我们称之为Foo
。此类包含一个构造函数和两个方法:
// constructor
Foo();
// returns a random int
public int bar();
// generates a random int "x" and calls integerGenerated(x)
public void generateInt(IntGeneratorListenerInterface listenerInterface);
这假定 Java 接口IntGeneratorListenerInterface
一种方法:
void integerGenerated(int generatedInt);
我能够从本机 C 和 C++ 调用bar()
。下面是一个C++示例,假设正确初始化JNIEnv
env
:
// instantiate Foo
jclass fooClass = env->FindClass("com/my/package/Foo");
jmethodID constructorMethodID = env->GetMethodID(fooClass, "<init>", "()V");
jobject fooInstance = env->NewObject(fooClass, constructorMethodID);
// call bar()
jmethodID barMethodID = env->GetMethodID(fooClass, "bar", "()I");
jint result = env->CallIntMethod(fooInstance, barMethodID);
printf("%d", result);
我想做的是实现来自 C/C++ 的接口IntGeneratorInterface
,这样当我使用类似的 JNI 调用调用generateInt()
时,我可以接收 C 语言的回调,例如:
void integerGenerated(int x)
{
// do something with the int
}
我的问题:有没有办法在 C/C++ 中实现 Java 接口,这样我就可以将有效的东西传递给generateInt()
,并在 C 中调用integerGenerated()
?
我已经研究了 JNI 的RegisterNatives()
,但我相信这将需要 Java 代码声明和调用"本机"方法(如果我错了,请纠正我),而且我没有修改现有 Java 库的奢侈。另请注意,这里只是使用简单的 Java 库来举例说明我的问题。我意识到如此简单的功能可以在本机轻松编写。
是的。就像使用任何其他本机方法一样:
class NativeRunnable implements Runnable {
@Override
public native void run();
}
现在只需使用 javah
创建头文件并实现函数。
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 用于AVX的ln(x)的实现,m256
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 在C++中,如何在类和函数(可能是模板化的)的头中编写完整的实现
- std::random_device是如何实现的