从 Java 调用 c++,然后从相同的 c++ 方法调用 java 方法
Call from Java to c++ and then from the same c++ method make a call to java method
下面的代码可以从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);
}
}
示例.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,但它崩溃了。
示例.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创建一个完整的流程。关于这个问题的任何信息都将非常有用。
从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 不感兴趣!
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 枚举环境变量的惯用C++14/C++17方法
- 初始化具有非默认构造函数的std::数组项的更好方法