2012-10-12 128 views
1

以下代码可以从Java调用C++方法。从Java调用到C++,然后从相同的C++方法调用java方法

JNITest.java

public class JNITest { 
    static { 
     System.load("D:\\gagan docs\\TestJava\\Example.dll"); 
    } 

    public native int intMethod(int n); 

    public static void main(String[] args) { 
     JNITest jnitest = new JNITest(); 
     int square=jnitest.intMethod(5); 
     System.out.println("HelloWorld"); 
     System.out.println("From init method"+square); 
    } 

} 

Example.cpp

#include "JNITest.h" 
#include<string.h> 
JNIEXPORT jint JNICALL Java_JNITest_intMethod(JNIEnv *env, jobject obj, jint num) 
{ 
    return num*num; 
} 

但是,当我尝试调用从上面的CPP使用以下Java方法,JVM的崩溃。

我也试着用createJavaVM方法来创建JVM,但它崩溃了。

Example.cpp

#include "JNITest.h" 
#include<string.h> 
static JavaVM *jvm = NULL 
JNIEXPORT jint JNICALL Java_JNITest_intMethod(JNIEnv *env, jobject obj, jint num) 
{ 
    JNIEnv* jenv; 
    int res = jvm->AttachCurrentThread((void **)&jenv, NULL); 
    return num*num; 
} 
我使用Linux(64位)机及JDK 64位(Java 1.6的)

我想从Java - > C++ - > Java做一个完整的流程。任何关于这个问题的信息都将非常有用。

+0

你甚至没有Java VM运行? – nneonneo

+0

http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/functions.html#wp16660 – Brian

+1

你是怎么从C++调用java方法的? (请使用代码) –

回答

1

调用从C++ Java是的(相对)简单的事情:

JNIEXPORT jint JNICALL Java_JNITest_intMethod(JNIEnv *env, jobject obj, jint num) 
{ 
    jint x = (env)->CallIntMethod(obj, method_id); 
    // or, (env)->CallVoidMethod(obj, voidMethod, ...), etc. 
} 

这是假设班级的jobject已鉴定jmethodID方法。获得jmethodID也很简单:

jclass class_inst = (env)->FindClass("pkg/to/my/stuff/Class"); 
jmethodID method_id = (env)->GetMethodId(class_inst, "methodName", "()I"); 

得到你想要调用特定类的方法可能是最具挑战性的任务,但一点都不难,一旦你有基本面把握好。

一个很好的例子(免责声明:我是该示例的作者),请参阅inotify-interface.cpp

还请注意,您可能不是有兴趣致电AttachCurrentThread

+0

谢谢isengrab ..我试过你建议的thins,它在JNIEXPORT内部没有创建jvm的情况下工作正常.. – Jaweriya

+0

感谢所有人,并感谢isengrab ..我尝试了上面提到的东西,它工作正常,无需在JNIEXPORT内创建jvm ..但是如果我想在JNIEXPORT环境外完全创建一个jvm ..ie我试图创建一个jvm完全只使用cpp使用createJavaVM或AttachCurrentThread或AttachCurrentThreadAsDaemon根据jdk版本..但所有这些方法返回零..而GetCreatedJavaVM也返回零..我在Linux 64位机上使用jdk1.6 ..任何建议将非常有帮助.. – Jaweriya