使用 Bridj 和 JNAerator 在 Java 中使用指针地址
use Pointer address in Java using Bridj and 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 Class) 调用 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);
我的"equivalent"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 代码中我得到了我例外的其他东西)。
当我执行 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)));
}
希望对某人有所帮助
我在 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 Class) 调用 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);
我的"equivalent"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 代码中我得到了我例外的其他东西)。
当我执行 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)));
}
希望对某人有所帮助