【问题标题】:Is it possible for a C++ program to receive Java method calls from an embedded JVM running through JNI?C++ 程序是否可以从通过 JNI 运行的嵌入式 JVM 接收 Java 方法调用?
【发布时间】:2022-06-19 06:01:46
【问题描述】:

我有下面的 Java 代码:

public class JavaToC {
    
    protected void hereIsYourCallback(long l, double d, boolean b, Object obj) {
        // this should be implemented by subclasses
    }
    
    public void start() {
        try {
            while(true) {
                Thread.sleep(5000);
                hereIsYourCallback(3L, Math.PI, true, "Hello from Java!"); 
            }
        } catch(InterruptedException e) {
            // NOOP
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

是否可以编写一个 C++ 代码,以某种方式将每个 JVM 调用捕获到hereIsYourCallback?请注意,此回调必须来自通过 JNI_CreateJavaVM 实例化的嵌入式 JVM。

【问题讨论】:

  • 当然,只需提供一个派生自JavaToc 的类,将hereIsYourCallback() 声明为native,并提供您自己的实现。
  • 好的,但是我是通过 Java 启动我的 C++ 应用程序(通过命令行启动 JVM)还是通过 C++ 可执行文件启动我的 C++ 应用程序(通过 JNI_CreateJavaVM 实例化 JVM ) ???
  • 这听起来像是使用 JavaCPP 之类的工具更容易实现,它可以生成您需要的所有 JNI 代码:github.com/bytedeco/javacpp#creating-callback-functions

标签: java c++


【解决方案1】:

如果您仍在寻找解决方案:您需要使用 jni.h 中的 RegisterNatives() 函数。这样,您可以将宿主 (c/c++) 环境中存在的函数注册到嵌入式 jvm 上的本地方法。

有关更多信息,请参阅this question,但要点是,假设一个具有本机 void printingFromC() 方法的类:

像这样创建你的函数:

JNIEXPORT void JNICALL printingFromC (JNIEnv* env, jobject thisObject) {
    printf("Hello there!");
}

这样描述你的原生方法(第一个字符串是java中的方法名,不需要匹配C/C++函数名:

static JNINativeMethod methods[] = {
    {"printingFromC", "()V", (void*) &printingFromC },
};

然后在加载类之后,在调用任何本地方法之前,注册它们:

myCls = (jclass) (*env)->FindClass(env, "my/path/MyClass");
(*env)->RegisterNatives(env, myCls, methods, sizeof(methods)/sizeof(methods[0]));

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    相关资源
    最近更新 更多