JNI:将对象从Java返回到C,并将其传递回Java
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了JNI:将对象从Java返回到C,并将其传递回Java,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2565字,纯文字阅读大概需要4分钟。
内容图文
![JNI:将对象从Java返回到C,并将其传递回Java](/upload/InfoBanner/zyjiaocheng/661/acee997b25d44ae0ab8e2802893612b5.jpg)
我有一些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 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<void**>(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<jobject>(javaObject));
}
// add this method - it should be called when you finish using the object
void JavaCalls::ReleaseObject(void* javaObject) {
DeleteGlobalRef(jMain, static_cast<jobject>(javaObject));
}
内容总结
以上是互联网集市为您收集整理的JNI:将对象从Java返回到C,并将其传递回Java全部内容,希望文章能够帮你解决JNI:将对象从Java返回到C,并将其传递回Java所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。