gpt4 book ai didi

java - C附加到现有的jvm

转载 作者:太空宇宙 更新时间:2023-11-04 03:46:09 25 4
gpt4 key购买 nike

我需要从 C 代码调用一些 Java 函数。我找到了一些关于如何从 C 创建新的 jvm 的教程,但我需要一个现有的 jvm(我知道她的 PID)。此外,在我的例子中,C dll 是由 Java 使用 JNI 调用的,我需要从 C 回调该 JVM。

这里是我的部分代码:

Java:

public class HelloJNI {

static {
// hello.dll on Windows or libhello.so on Linux
System.loadLibrary("hello");
}

// native method for call C dll
private native String getHello(int jvmProcessId);

public String doHello(){
return getHello(myProcessId);
}
}

C:

#include "hellojni_actions_HelloJNI.h"

void invoke_class(JNIEnv* env) {
// HERE I NEED TO CALL A METHOD OF JAVA CLASS WHICH LOADED ME (HelloJNI.java) IN THE SAME JVM
}

JNIEXPORT jstring JNICALL Java_hellojni_actions_HelloJNI_getHello
(JNIEnv *env, jobject thisObj, jint jvmProcessId){
invoke_class(env);
return (*env)->NewStringUTF(env, "Testing...");

}

最佳答案

我前段时间做过类似的事情,可以粘贴一些代码片段(要进行错误检查):

请注意调用的方法是obj的对象方法

void callJavaMethod( JNIEnv *env, jobject obj )
{
jclass cl;
jmethodID id;
jstring js1;
jstring js2;
jobject byteArray;

/* Im looking for byte[] javaMethod( String s1, String s2 ) */
cl = (*env)->GetObjectClass( env, obj );
id = (*env)->GetMethodID( env, cl, "javaMethod", "(Ljava/lang/String;Ljava/lang/String;)[B" );

/* and now it's called */
js1 = (*env)->NewStringUTF(env, "Hello");
js2 = (*env)->NewStringUTF(env, "Java");

byteArray = (*env)->CallObjectMethod( env, obj, js1, js2 );
/* for other return types there are other CallxxxMethod() functions */

...
}

可以找到 Java 7 的 JNI API 文档 here (对于 Java 6 应该是完全一样的)

关于java - C附加到现有的jvm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24268926/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com