【发布时间】:2014-10-09 13:55:29
【问题描述】:
我有一些 Java 方法需要通过 JNI 从 C++ 调用。我的 JNI 实现基于
Is it possible to make a Java JNI which calls jdbc?
我的 Java 项目中有两个 java 文件。一个是定义一个类,另一个包含c++将调用的实际方法。
public class MyObject {
private static int no;
private static LocalDateTime time;
private static String status;
// getters, setters and toString
}
public class ObjectHandler {
public static MyObject objectReturnToC;
public static Object methodA (type1 arg1, type2 arg2, type3 arg3) {
objectReturnToC = new MyObject();
// setting fields in returnObject according to passed-in parameters
return objectReturnToC;
}
public static void methodB(Object objectReturnedFromC) {
// access fields in objectReturnedFromC, do computation and store in
}
}
我在 Visual Studio 2010 中创建了 C++ DLL。有 JVM.cpp、JVM.h、JavaCalls.h 和 JavaCalls.cpp
JavaCalls.h
#ifdef JAVACALLSDLL_EXPORTS
#define JAVACALLSDLL_API __declspec(dllexport)
#else
#define JAVACALLSDLL_API __declspec(dllimport)
#endif
namespace JavaCalls
{
class JavaCalls
{
public:
static JAVACALLSDLL_API void *javaMethodA(type1, type2, type3);
static JAVACALLSDLL_API string toString(void **javaObject);
static JAVACALLSDLL_API void javaMethodB(void **javaObject);
};
}
JavaCalls.cpp
namespace JavaCalls
{
void *JavaCalls::javaMethodA(type1 arg1, type2 arg2, type3 arg3)
{
// invoke JVM
// Find class, methodID
jobject javaObject = CallStaticObjectMethod(jMain, "methodA",...);
return javaObject;
}
void JavaCalls::javaMethodB(void** javaObject) {
// invoke JVM
// Find class, methodID
CallStaticVoidMethod(jMain, "methodB",...);
}
}
C++使用DLL调用Java方法A和方法B:
int main()
{
void* a = JavaCalls::JavaCalls::javaMethodA(arg1, arg2, arg3);
// doing other stuff and updating fields in a
JavaCalls::JavaCalls::javaMethodB(static_cast<void**>(a));
}
显然,传递指针,希望它对 C++ 可用是行不通的。但是我应该怎么做才能将 Java 对象保留在 C++ 中并稍后将其传递回 Java?我应该创建一个 C++ 结构并使用 GetObjectField 将 Java 对象字段映射到其中吗?
【问题讨论】:
-
你为什么使用
void指针?是什么阻止你只是通过jobjects?使用void**有什么意义? -
我认为 void 指针是用于通用指针的,不知道我可以在 c++ dll 中保留 jobject 并传递它。我一定要试试。稍后我还需要移植它,以便 C 和 FORTRAN 可以调用 Java 方法。即使使用 C 和 FORTRAN,您认为通过 jobject 是一个不错的选择吗?
-
问题是为什么需要这样调用jdbc?您可以直接从 C++ 连接到 DB,它可能会更高效。
-
我知道我可以直接从 c++ 连接 DB,但我们决定不需要在所有用户计算机上安装 obdc 驱动程序(这引起了很多头痛和开销,请不要问我如何.) 这就是为什么我需要在 C++ 中通过 JNI 调用 jdbc
标签: java c++ pointers java-native-interface