【问题标题】:Cast a function pointer to a long将函数指针转换为 long
【发布时间】:2016-09-01 09:45:53
【问题描述】:

我不确定这是否可行,但我需要将函数指针转换为 long 以便将 C 级代码映射回 java 代码。

【问题讨论】:

  • 你能发布你的代码吗?
  • 在附件中:J.2 未定义的行为
  • 做一些最小的测试,转换为long 似乎不会按位改变指针。所以我会说作为jlong 回传是安全的。
  • 如果我错了,请纠正我,但这里的想法是,由于 Java 没有指针,您需要将 C 指针转换为 jlong(这只是一个 long)能够将其传递回 Java 代码。您可以在那里存储它,或将其传递回另一个本机函数,在其中您可以将其转换回正确的函数类型,然后调用它。
  • @AlterMann 您没有正确引用标准。首先,附件 J 只是一个信息摘要,它不是规范性的,所以从那里引用一些东西并不能证明任何事情。 6.3.2.3/6 中的实际规范文本是这样的:“任何指针类型都可以转换为整数类型。除非前面指定,结果是实现定义的。如果结果不能以整数类型表示,则行为未定义。结果不必在任何整数类型的值范围内。”所以它不一定是未定义的行为。

标签: java c java-native-interface


【解决方案1】:

指针的值是一个整数,你只需要知道你到底在做什么,并分配足够的存储空间来存储指针的值。 (在 32 位操作系统中,指针占用 32 位存储空间,在 64 位操作系统中,指针占用 64 位存储空间。

一个 C 例子:

#include <stdio.h>

void fun()
{
    printf("fun\n");
    return;
}

typedef void (*fun_type)();

int main()
{
    long long int a = (long long int)fun;

    fun_type func_point = (fun_type)a;

    func_point();
    return 0;
}

【讨论】:

  • long long int 转换为指针,反之亦然,将对某些 32 位编译器发出警告。正确的方法是通过intptr_t进行投射。
猜你喜欢
  • 1970-01-01
  • 2017-08-28
  • 1970-01-01
  • 2012-11-21
  • 1970-01-01
  • 2016-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多