C附加到现有的jvm

时间:2014-06-17 16:27:01

标签: java c eclipse jvm java-native-interface

我需要从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...");

}

2 个答案:

答案 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代码以使用somekind IPC,否则不能以跨平台方式执行此操作。如果您只关心Windows,可以abuse SetWindowsHookEx完成目标或使用CreateRemoteThread函数删除现有JVM pid上的新线程。