栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

jni不支持void *,unsigned int *等类型,该怎么办?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

jni不支持void *,unsigned int *等类型,该怎么办?

您可以

jlong
用来将指针(或指向该指针的指针,或其他)传递回Java。Java代码除了将它作为参数传递给其他方法之一之外,将不能用于任何其他用途。但是通常这就是您真正想要的。另一方面,如果要
Initialize()
使用Java设置的数据来调用它,则
void*
不合适;您将需要使用Java类,并在JNI中使用反射来从中获取所需的信息。

好听的,你可以包装

malloc()
free()

jlong Java_c_utils_malloc(JNIEnv* env, jclass clazz, jint size) {    return (jlong) malloc(size);}void Java_c_utils_free(JNIEnv* env, jclass clazz, jlong ptr) {   free((void *) ptr);}

然后在Java中使用它们(无效!):

long ptr = utils.malloc(100);// Store ptr for a whileutils.free(ptr);

现在,如果我们包装一些需要一块内存作为参数的其他函数,我们也可以包装它们,并让它们接受

jlong
参数,方法
free()
与之相同。Java变量
ptr
代表一个内存地址这一事实在Java中是完全不透明的,但是仍然很有用。

Java的窗口系统实现(即AWT,SWT)使用相同的方式将本机窗口小部件句柄与Java组件相关联。

现在,如果您希望

Initialize()
能够从Java中获取有用的参数,那么a
void*
并不会减少它。您需要编写方法以接受Java对象作为参数。这是允许您使用Java操作对象的唯一方法。

我不想在这里重复所有代码,但是Sun的JNI教程在这里。这是关于调用Java对象(

this
对象或作为参数传递给您的方法的任意方法)的部分,这与访问对象的字段类似。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/454884.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号