How to jextract
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Tue Dec 18 12:01:25 UTC 2018
Hi,
this has been fixed by a somewhat larger jextract rewrite [1].
Now, your very first command line:
jdk-12/bin/jextract /usr/include/x86_64-linux-gnu/sys/sysinfo.h
Should be enough to generate a self-contained artifact; if I do that
locally, I get this:
classes/
├── cdefs.class
├── META-INF
│ └── jextract.properties
├── sysinfo.class
└── usr
└── include
├── asm_generic
│ ├── bitsperlong.class
│ ├── int_ll64.class
│ ├── int_ll64$__s16.class
│ ├── int_ll64$__s32.class
│ ├── int_ll64$__s64.class
│ ├── int_ll64$__s8.class
│ ├── int_ll64$__u16.class
│ ├── int_ll64$__u32.class
│ ├── int_ll64$__u64.class
│ ├── int_ll64$__u8.class
│ ├── posix_types.class
│ ├── posix_types$__kernel_caddr_t.class
│ ├── posix_types$__kernel_clockid_t.class
│ ├── posix_types$__kernel_clock_t.class
│ ├── posix_types$__kernel_daddr_t.class
│ ├── posix_types$__kernel_fsid_t.class
│ ├── posix_types$__kernel_gid16_t.class
│ ├── posix_types$__kernel_gid32_t.class
│ ├── posix_types$__kernel_gid_t.class
│ ├── posix_types$__kernel_ino_t.class
│ ├── posix_types$__kernel_ipc_pid_t.class
│ ├── posix_types$__kernel_loff_t.class
│ ├── posix_types$__kernel_long_t.class
│ ├── posix_types$__kernel_mode_t.class
│ ├── posix_types$__kernel_off_t.class
│ ├── posix_types$__kernel_pid_t.class
│ ├── posix_types$__kernel_ptrdiff_t.class
│ ├── posix_types$__kernel_size_t.class
│ ├── posix_types$__kernel_ssize_t.class
│ ├── posix_types$__kernel_suseconds_t.class
│ ├── posix_types$__kernel_timer_t.class
│ ├── posix_types$__kernel_time_t.class
│ ├── posix_types$__kernel_uid16_t.class
│ ├── posix_types$__kernel_uid32_t.class
│ ├── posix_types$__kernel_uid_t.class
│ ├── posix_types$__kernel_ulong_t.class
│ └── types.class
├── features.class
├── linux
│ ├── kernel.class
│ ├── posix_types.class
│ ├── posix_types$FI1.class
│ ├── posix_types$__kernel_fd_set.class
│ ├── posix_types$__kernel_key_t.class
│ ├── posix_types$__kernel_mqd_t.class
│ ├── posix_types$__kernel_sighandler_t.class
│ ├── sysinfo.class
│ ├── sysinfo$sysinfo.class
│ ├── types$__be16.class
│ ├── types$__be32.class
│ ├── types$__be64.class
│ ├── types.class
│ ├── types$__le16.class
│ ├── types$__le32.class
│ ├── types$__le64.class
│ ├── types$__sum16.class
│ └── types$__wsum.class
├── stdc_predef.class
└── x86_64_linux_gnu
├── asm
│ ├── bitsperlong.class
│ ├── posix_types_64.class
│ ├── posix_types_64$__kernel_old_dev_t.class
│ ├── posix_types_64$__kernel_old_gid_t.class
│ ├── posix_types_64$__kernel_old_uid_t.class
│ └── types.class
├── bits
│ └── wordsize.class
└── gnu
└── stubs_64.class
And, if I look at classes/sysinfo.class with javap:
$ javap classes/sysinfo.class
public interface sysinfo {
public abstract int
sysinfo(java.foreign.memory.Pointer<usr.include.linux.sysinfo$sysinfo>);
public abstract int get_nprocs_conf();
public abstract int get_nprocs();
public abstract long get_phys_pages();
public abstract long get_avphys_pages();
public int _SYS_SYSINFO_H();
}
You can see that the sysinfo function takes a pointer to
usr/include/linux/sysinfo$sysinfo, where that is the struct you want:
$ javap classes/usr/include/linux/sysinfo\$sysinfo.class
public interface usr.include.linux.sysinfo$sysinfo extends
java.foreign.memory.Struct<usr.include.linux.sysinfo$sysinfo> {
public abstract long uptime$get();
public abstract void uptime$set(long);
public abstract java.foreign.memory.Pointer<java.lang.Long> uptime$ptr();
public abstract java.foreign.memory.Array<java.lang.Long> loads$get();
public abstract void
loads$set(java.foreign.memory.Array<java.lang.Long>);
public abstract
java.foreign.memory.Pointer<java.foreign.memory.Array<java.lang.Long>>
loads$ptr();
public abstract long totalram$get();
public abstract void totalram$set(long);
public abstract java.foreign.memory.Pointer<java.lang.Long>
totalram$ptr();
public abstract long freeram$get();
public abstract void freeram$set(long);
public abstract java.foreign.memory.Pointer<java.lang.Long>
freeram$ptr();
public abstract long sharedram$get();
public abstract void sharedram$set(long);
public abstract java.foreign.memory.Pointer<java.lang.Long>
sharedram$ptr();
public abstract long bufferram$get();
public abstract void bufferram$set(long);
public abstract java.foreign.memory.Pointer<java.lang.Long>
bufferram$ptr();
public abstract long totalswap$get();
public abstract void totalswap$set(long);
public abstract java.foreign.memory.Pointer<java.lang.Long>
totalswap$ptr();
public abstract long freeswap$get();
public abstract void freeswap$set(long);
public abstract java.foreign.memory.Pointer<java.lang.Long>
freeswap$ptr();
public abstract short procs$get();
public abstract void procs$set(short);
public abstract java.foreign.memory.Pointer<java.lang.Short> procs$ptr();
public abstract short pad$get();
public abstract void pad$set(short);
public abstract java.foreign.memory.Pointer<java.lang.Short> pad$ptr();
public abstract long totalhigh$get();
public abstract void totalhigh$set(long);
public abstract java.foreign.memory.Pointer<java.lang.Long>
totalhigh$ptr();
public abstract long freehigh$get();
public abstract void freehigh$set(long);
public abstract java.foreign.memory.Pointer<java.lang.Long>
freehigh$ptr();
public abstract int mem_unit$get();
public abstract void mem_unit$set(int);
public abstract java.foreign.memory.Pointer<java.lang.Integer>
mem_unit$ptr();
public abstract java.foreign.memory.Array<java.lang.Byte> _f$get();
public abstract void _f$set(java.foreign.memory.Array<java.lang.Byte>);
public abstract
java.foreign.memory.Pointer<java.foreign.memory.Array<java.lang.Byte>>
_f$ptr();
}
I hope this helps.
Cheers
Maurizio
On 07/12/2018 04:06, Mitsuru Matsushima wrote:
> Thank you for your response.
> I hope this bug will be fixed :)
>
> Mitsuru
>
>> -----Original Message-----
>> From: Maurizio Cimadamore <maurizio.cimadamore at oracle.com>
>> Sent: Friday, December 07, 2018 2:31 AM
>> To: Matsushima Mitsuru(松島 充) <m-matsushima at bk.jp.nec.com>; 'panama-dev at openjdk.java.net'
>> <panama-dev at openjdk.java.net>
>> Subject: Re: How to jextract
>>
>> Looking closer at the code, the issue with -m not generating anything is caused by the fact that the various
>> Context::collectXYZ methods are filtering away all packages that are not the 'target' one (the one set by -t). This is buggy
>> behavior - we should just generate all packages we have got up to that point; there's no reason to do the filtering.
>>
>> Maurizio
>>
>> On 06/12/2018 11:21, Maurizio Cimadamore wrote:
>>> I can see that this is indeed an issue - jextract doesn't seem to
>>> follow the include <kernel.h>...
>>>
>>> https://bugs.openjdk.java.net/browse/JDK-8214948
>>>
>>> Thanks for the report. Your workaround seems ok, but really, this
>>> should just work.
>>>
>>> Maurizio
>>>
>>>
>>> On 06/12/2018 10:25, Mitsuru Matsushima wrote:
>>>> jdk-12/bin/jextract /usr/include/x86_64-linux-gnu/sys/sysinfo.h
More information about the panama-dev
mailing list