在JNI中,是否有比jlong​​更便携的方法来封装指针?

 mobiledu2502908197 发布于 2023-02-07 18:38

我见过使用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标准库类?

1 个回答
  • 您可以使用哈希表存储指针并将该哈希表的键返回给用户。喜欢:

     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;
       }
    

    现在,您可以使用一个句柄从哈希图中获取指针:

    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(简化包装器和接口生成器)。

    2023-02-07 18:40 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有