java - 使用 Bridj 和 JNAerator 在 Java 中使用指针地址

标签 java c native jna jnaerator

我在 C 中有这段代码,我想用 Java 编写相同的代码:

static u_int32_t print_pkt (struct nfq_data *tb){
    unsigned char *data;
    ret = nfq_get_payload(tb, &data);
    if (ret >= 0)
        printf("payload_len=%d ", ret);
    printf("data: ");
    for(i=0;i<ret;i++){
        printf("%c",data[i]);
    }
    fputc('\n', stdout);
    return ret;
}

我使用 JNAerator 在 Java 中创建了将使用 Bridj(Mylib 类)调用 C 函数 nfq_get_payload 的函数:

public static int nfq_get_payload(Pointer<Netfilter_queueLibrary.nfq_data > nfad, Pointer<Pointer<Byte > > data) {
    return nfq_get_payload(Pointer.getPeer(nfad), Pointer.getPeer(data));
}
protected native static int nfq_get_payload(@Ptr long nfad, @Ptr long data);

我的“等效”Java 代码是:

static int print_pkt (Pointer< nfq_data > tb)
{
    int ret;
    Pointer<Byte> data =null;
    ret = MyLib.nfq_get_payload(tb, Pointer.pointerToPointer(data));
    if (ret >= 0){
        System.out.println(String.format(" payload_len=%d ", ret));
        System.out.print("data: ");
        for(int i=0;i<ret;i++){
            System.out.print(data.get(i));
        }
    }
    System.out.println();

    return ret;
}

我应该提到,在使用 C 代码和 Java 代码时,ret 值是相同的,但是当我尝试访问数据时,在使用 Java 时会引发 NullPointerException(在 C 代码中,我得到了一些我异常(exception)的东西)。 当我做 Pointer<Byte> data =Pointer.allocateBytes(4096);我得到的是零而不是空指针异常,但由于我没有在 C 代码中分配内存,所以我认为我也不应该在 Java 代码中这样做。

感谢您的宝贵时间和帮助 干杯

最佳答案

我终于通过这种方式找到了修复方法,但仍然不知道为什么第一个不起作用:

val data2 = Pointer.pointerToPointer(data);
ret = Netfilter_queueLibrary.nfq_get_payload(tb, data2)
if (ret >= 0) {
  println(String.format(" payload_len=%d ", ret));
  println("data: ");
  for (i <- 0 until ret) {
    printf("%02x", (data2.get().getBytes(ret)(i)));
  }

希望对大家有帮助

关于java - 使用 Bridj 和 JNAerator 在 Java 中使用指针地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28210622/

相关文章:

java - 在 tomcat 上以编程方式部署 Web 服务

c - 带有 if 条件的未使用变量

c++ - JSON 模式验证

android - 我需要 root 权限才能在 Android 下执行 native 应用程序?

javax.xml.ws.WebServiceException : java. io.IOException:写入服务器 Tomcat 8 时出错

java - 在 Java 中,如何从派生类中的覆盖方法调用基类的方法?

java - 为什么 System.arraycopy 在 Java 中是原生的?

javascript - 如何确定 JavaScript 函数是原生的(无需测试 '[native code]' )

java - 从mapstruct收到错误 "Several possible source properties for target property"时如何避免显式映射?

c - 错误 :"pointer being realloc' d 未分配”在 macOS 上,但在 Windows 上尝试重新分配两次时有效