Java调用c 返回class_JNI:将对象从Java返回到C,并将其传递回Java

我的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 methodA和methodB:

int main()

{

void* a = JavaCalls::JavaCalls::javaMethodA(arg1, arg2, arg3);

// doing other stuff and updating fields in a

JavaCalls::JavaCalls::javaMethodB(static_cast(a));

}

显然,传递指针,希望C可以使用它是行不通的.但是,我应该怎么做才能将Java对象保留在C中,并在以后将其传递回Java?是否应该创建一个C结构并使用GetObjectField将Java Object字段映射到其中?

解决方法:

我不太明白为什么您需要在代码中使用void **.如果要使界面不透明,请使用void *.另外,不要忘记在返回的jobject上调用NewGlobalRef()和DeleteGlobalRef()-这将防止垃圾回收器对其破坏:

void *JavaCalls::javaMethodA(type1 arg1, type2 arg2, type3 arg3)

{

jobject javaObject = CallStaticObjectMethod(jMain, "methodA",...);

return NewGlobalRef(jMain, javaObject);

}

void JavaCalls::javaMethodB(void* javaObject) {

CallStaticVoidMethod(jMain, "methodB", static_cast(javaObject));

}

// add this method - it should be called when you finish using the object

void JavaCalls::ReleaseObject(void* javaObject) {

DeleteGlobalRef(jMain, static_cast(javaObject));

}

标签:java-native-interface,java,c-4,pointers

来源: https://codeday.me/bug/20191121/2049797.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值