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