以下代码可以从Java调用C ++方法。
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制作一个完整的流程 - &gt; C ++ - &gt; Java的。有关此问题的任何信息都非常有用。
答案 0 :(得分: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感兴趣!