Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java调用c++;然后从同一个c++;方法调用java方法 下面的代码可以调用java中的C++方法。_Java_C++_Java Native Interface - Fatal编程技术网

从Java调用c++;然后从同一个c++;方法调用java方法 下面的代码可以调用java中的C++方法。

从Java调用c++;然后从同一个c++;方法调用java方法 下面的代码可以调用java中的C++方法。,java,c++,java-native-interface,Java,C++,Java Native Interface,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();

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);
    }

}
示例.cpp

#include "JNITest.h"
#include<string.h>
JNIEXPORT jint JNICALL Java_JNITest_intMethod(JNIEnv *env, jobject obj, jint num)
{
    return num*num;
}
#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;
}
#包括“JNITest.h”
#包括
JNIEXPORT jint JNICALL Java_JNITest_intMethod(JNIEnv*env,jobject obj,jint num)
{
返回num*num;
}
但是,当我尝试使用以下命令从上述CPP调用java方法时,JVM崩溃

我还尝试使用createJavaVM方法来创建JVM,但它崩溃了

示例.cpp

#include "JNITest.h"
#include<string.h>
JNIEXPORT jint JNICALL Java_JNITest_intMethod(JNIEnv *env, jobject obj, jint num)
{
    return num*num;
}
#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;
}
#包括“JNITest.h”
#包括
静态JavaVM*jvm=NULL
JNIEXPORT jint JNICALL Java_JNITest_intMethod(JNIEnv*env,jobject obj,jint num)
{
JNIEnv*jenv;
int res=jvm->AttachCurrentThread((void**)和jenv,NULL);
返回num*num;
}
我使用的是Linux(64位)机器和JDK 64位(Java1.6)


我想从java到C++ +> java中完成一个完整的流程。关于这个问题的任何信息都是非常有用的。

< P>从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");
对于一个特定的类,获得你想要调用的方法可能是你最具挑战性的任务,但一旦你掌握了基本原理,就一点也不难了

有关一个很好的示例(免责声明:我是该示例的作者),请参阅


另外请注意,您可能对打电话不感兴趣

>从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");
对于一个特定的类,获得你想要调用的方法可能是你最具挑战性的任务,但一旦你掌握了基本原理,就一点也不难了

有关一个很好的示例(免责声明:我是该示例的作者),请参阅


另外请注意,您可能对打电话不感兴趣

你甚至没有java VM运行吗?你如何调用C++的java方法?(请编写代码)如果您已经在从Java调用
native
方法,则不需要创建新的JVM。一个例子,使用代码> >创建Javaavm()/Cuffe,将在java程序周围制作一个<代码> exe < /C>包装器,而不是提供本地方法。你甚至没有运行java虚拟机吗?你如何调用C++中的java方法?(请编写代码)如果您已经在从Java调用
native
方法,则不需要创建新的JVM。
createJavaVM()
的一个示例用例是围绕Java程序制作一个
.exe
包装器,而不是提供本机方法。谢谢isengrab。。我尝试了您建议的方法,在JNIEXPORT中不创建jvm,效果很好..谢谢大家,谢谢isengrab。。我尝试了上面您建议的方法,它可以很好地工作,而无需在JNIEXPORT内创建jvm。。但是如果我想在JNIEXPORT环境之外创建一个jvm。我正在尝试根据jdk版本,使用createJavaVM或AttachCurrentThread或AttachCurrentThreadAsDaemon,完全在cpp内部创建jvm。。但是所有这些方法都返回零。。GetCreatedJavaVM也返回零。。我在Linux 64位机器上使用jdk1.6。。任何建议都会很有帮助的谢谢你。。我尝试了您建议的方法,在JNIEXPORT中不创建jvm,效果很好..谢谢大家,谢谢isengrab。。我尝试了上面您建议的方法,它可以很好地工作,而无需在JNIEXPORT内创建jvm。。但是如果我想在JNIEXPORT环境之外创建一个jvm。我正在尝试根据jdk版本,使用createJavaVM或AttachCurrentThread或AttachCurrentThreadAsDaemon,完全在cpp内部创建jvm。。但是所有这些方法都返回零。。GetCreatedJavaVM也返回零。。我在Linux 64位机器上使用jdk1.6。。任何建议都会很有帮助。。