我需要从C代码中调用一些Java函数。我找到了一些关于如何从C创建新jvm的教程,但我需要一个现有的jvm(我知道她的PID)。此外,就我而言,Java使用JNI调用C dll,我需要从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...");
}
答案 0 :(得分:1)
前段时间我做过类似的事情并且可以粘贴一些代码片段(错误检查要完成):
请注意,调用的方法是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应该完全相同)
答案 1 :(得分:0)
除非您从Java加载共享库或修改Java代码以使用some的kind IPC,否则不能以跨平台方式执行此操作。如果您只关心Windows,可以abuse SetWindowsHookEx完成目标或使用CreateRemoteThread函数删除现有JVM pid上的新线程。