java – 在JNI中,是否有比jlong更便携的方法来封装指针?
发布时间:2020-05-24 09:37:44 所属栏目:Java 来源:互联网
导读:我已经看到使用long / jlong来允许 Java对象保持C指针的示例: class Foo { private native long create();}struct Foo { };JNIEXPORT jlong JNICALL Java_Foo_create (JNIEnv *, jobject){ return (jlong) (new Foo);
|
我已经看到使用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对象. 或者,如果您需要为Java实现包装器,我建议考虑SWIG(Simplified Wrapper和Interface Generator). (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
