gpt4 book ai didi

java - 在JNI中,有没有比jlong​​更可移植的方式来封装指针呢?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:50:17 25 4
gpt4 key购买 nike

我见过使用 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 (简化的包装器和接口(interface)生成器)。

关于java - 在JNI中,有没有比jlong​​更可移植的方式来封装指针呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20811213/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com