我已经看到使用long / jlong来允许
Java对象保持C指针的示例:
class Foo { private native long create(); } struct Foo { }; JNIEXPORT jlong JNICALL Java_Foo_create (jnienv *,jobject) { return (jlong) (new Foo); }
这让我觉得有点紧张,因为它假设一个指针适合64位;这在OS / 400上是不真实的.
是否有更安全的解决方案,例如封装C指针的Java标准库类?
解决方法
您可以使用哈希表来存储指针并将此哈希表的键返回给用户.喜欢:
std::unordered_map<long,Foo*> handles; long newHandle = 0 ... JNIEXPORT jlong JNICALL Java_Foo_create (jnienv *,jobject) { Foo* ptr = new Foo; long handle = newHandle; handles.insert(std::pair<long,Foo*>(newHandle++,ptr)); return handle; }
现在您可以使用句柄从hashmap获取指针:
JNIEXPORT void JNICALL Java_Foo_use (jnienv *,jobject,jlong handle) { auto iter = handles.find(handle); if (iter != handles.end()) { Foo* ptr = iter->second; // use Foo* here } }
此方法还可以帮助您检查对象是否已被删除或删除仍然存在的所有Foo对象.
缺点是访问hashmap以获取指针会降低性能.此外,您应该使用多线程访问或使用线程安全映射实现来保护您的句柄映射.
或者,如果您需要为Java实现包装器,我建议考虑SWIG(Simplified Wrapper和Interface Generator).
原文地址:https://www.jb51.cc/java/130157.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。