рдХреБрдЫ рджрд┐рдиреЛрдВ рдкрд╣рд▓реЗ рдореИрдВрдиреЗ рдмреНрд░рд╛рдпрди рдЧреЛрдПрддреНрдЬрд╝ рдХреЗ рдПрдХ рдЯреНрд╡реАрдЯ рдХреЛ рджреЗрдЦрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЖрдЬ рдХреЗрд╡рд▓ рдореЗрд░реЗ рд╣рд╛рде рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣реБрдВрдЪреЗред

рдореИрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
Habr├й рдкрд░
рдкрдирд╛рдорд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдмрд╛рд░реЗ
рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд┐рдЦрд╛ рдерд╛ ред рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдХреНрдпреЛрдВ рд╣реИ, рдЖрдкрдХреЛ рдпрд╣рд╛рдВ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдХреЗрд╡рд▓
рджреЗрд╢реА рдмрд╛рдЗрдВрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдХреБрдЫ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рддрд╛ рд╣реВрдБред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рд╕реА рдХрдВрдкрд╛рдЗрд▓рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рд▓рд┐рдирдХреНрд╕ рдпрд╛ рдореИрдХрдУрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╣реИред рдпрджрд┐ рд╡рд┐рдВрдбреЛрдЬ, рддреЛ рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ
Visual Studio 2017 рдХреЗ рд▓рд┐рдП Build Tools рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдФрд░, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдЖрдкрдХреЛ рдкрдирд╛рдорд╛ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде OpenJDK рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдк рдЗрд╕реЗ
рд╕рдВрдмрдВрдзрд┐рдд рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреА "рд╡рд┐рджреЗрд╢реА" рд╢рд╛рдЦрд╛ рдХрд╛
рдирд┐рд░реНрдорд╛рдг рдХрд░рдХреЗ рдпрд╛
рдЕрд░реНрд▓реА-рдПрдХреНрд╕реЗрд╕ рдмрд┐рд▓реНрдб рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЪрд▓реЛ рдПрдХ рдиреНрдпреВрдирддрдо рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ - рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рджреЛ рдирдВрдмрд░ рдЬреЛрдбрд╝рддрд╛ рд╣реИ:
adder.h#ifndef _ADDER_H #define _ADDER_H __declspec(dllexport) int add(int, int); #endif
adder.c #include "adder.h" __declspec(dllexport) int add(int a, int b) { return a + b; }
рдПрдХ DLL рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ
cl /LD adder.c
рдФрд░ рдЬрд╛рд╡рд╛ рдХреЛрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
import java.foreign.Library; import java.foreign.Libraries; import java.foreign.annotations.NativeHeader; import java.foreign.annotations.NativeFunction; import java.lang.invoke.MethodHandles; public class App { @NativeHeader interface Adder { @NativeFunction("(i32 i32)i32") int add(int a, int b); } public static void main(String[] args) { Library lib = Libraries.loadLibrary(MethodHandles.lookup(), "adder"); Adder adder = Libraries.bind(Adder.class, lib); System.out.println(adder.add(3, 5)); } }
рд╕реНрд░реЛрдд рдХреЗ рдкрд╛рд╕ рдЬреЗрдПрдирдЖрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реА рдкрд░рд┐рдЪрд┐рддрд┐рдпрд╛рдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП: рджреЗрд╢реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдкреБрд╕реНрддрдХрд╛рд▓рдп рднрд░реА рд╣реБрдИ рд╣реИ, рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реИ, рдФрд░ рдореВрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдореБрдЦреНрдп рдЕрдВрддрд░ рдЬрд╛рд╡рд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓ рдбреЗрдЯрд╛ рдХреА рдореИрдкрд┐рдВрдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдиреЛрдЯреЗрд╢рди рдореЗрдВ
рд▓реЗрдЖрдЙрдЯ рдбреЗрдлрд┐рдирд┐рд╢рди рд▓реИрдВрдЧреНрд╡реЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реИред
рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ "
(i32 i32)i32
" рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдЬреЛ рджреЛ 32-рдмрд┐рдЯ рдкреВрд░реНрдгрд╛рдВрдХ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ 32-рдмрд┐рдЯ рдкреВрд░реНрдгрд╛рдВрдХ рджреЗрддрд╛ рд╣реИред рд▓реЗрдмрд▓
i
рддреАрди рдореВрд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ - рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ, рдЬрд┐рд╕рдореЗрдВ рдЫреЛрдЯреЗ-рдПрдВрдбрд┐рдпрди рдмрд╛рдЗрдЯ рдХреНрд░рдо рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛,
u
рдФрд░
f
рдЕрдХреНрд╕рд░ рдкрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ - рдПрдХ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдкреВрд░реНрдгрд╛рдВрдХ рдФрд░ рдПрдХ рдлреНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рд╕рдВрдЦреНрдпрд╛, рдХреНрд░рдорд╢рдГред рд╕рдорд╛рди-рд▓реЗрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрдбрд╝реЗ-рдПрдВрдбрд┐рдпрди рдХреЗ рдЖрджреЗрд╢ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдКрдкрд░реА рдорд╛рдорд▓реЗ рдореЗрдВ -
I
,
U
,
F
рдПрдХ рдЕрдиреНрдп рд╕рд╛рдорд╛рдиреНрдп рд▓реЗрдмрд▓
v
, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ
void
рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдмрд▓ рдХреЗ рдмрд╛рдж рдХреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рдпреБрдХреНрдд рдмрд┐рдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИред
рдпрджрд┐ рд╕рдВрдЦреНрдпрд╛ рд▓реЗрдмрд▓ рд╕реЗ рдкрд╣рд▓реЗ рд╣реИ, рддреЛ рд▓реЗрдмрд▓ рдПрдХ рд╕рд░рдгреА рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ:
[42f32]
- рдкреНрд░рдХрд╛рд░ рдХреЗ 42 рддрддреНрд╡реЛрдВ рдХреА рдПрдХ
float
ред рд╡рд░реНрдЧ рдХреЛрд╖реНрдардХ рд╕рдореВрд╣ рд▓реЗрдмрд▓ред рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (
[i32 i32]
- рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ
int
рд╕рд╛рде рдПрдХ рд╕рдВрд░рдЪрдирд╛) рдФрд░ рдпреВрдирд┐рдпрдиреЛрдВ (
[u64|u64:f32]
-
long
рдпрд╛ рдПрдХ
float
рд▓рд┐рдП рд╕реВрдЪрдХ)ред
рдПрдХ рдмреГрд╣рджрд╛рдиреНрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рдорд┐рд▓рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
u64:i32
int
,
u64:v
рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ рд╣реИ
u64:v
рдкреНрд░рдХрд╛рд░
void
рдХрд╛ рдПрдХ рд╕реВрдЪрдХ рд╣реИ, рдФрд░
u64:[i32 i32]
рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИред
рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде, рдЙрджрд╛рд╣рд░рдг рдХреЛ рдереЛрдбрд╝рд╛ рдЬрдЯрд┐рд▓ рдХрд░рддреЗ рд╣реИрдВред
totalizer.c __declspec(dllexport) long sum(int vals[], int size) { long r = 0; for (int i = 0; i < size; i++) { r += vals[i]; } return r; }
App.java import java.foreign.Library; import java.foreign.Libraries; import java.foreign.NativeTypes; import java.foreign.Scope; import java.foreign.annotations.NativeHeader; import java.foreign.annotations.NativeFunction; import java.foreign.memory.Array; import java.foreign.memory.Pointer; import java.lang.invoke.MethodHandles; public class App { @NativeHeader interface Totalizer { @NativeFunction("(u64:i32 i32)u64") long sum(Pointer<Integer> vals, int size); } public static void main(String[] args) { Library lib = Libraries.loadLibrary(MethodHandles.lookup(), "totalizer"); Totalizer totalizer = Libraries.bind(Totalizer.class, lib); try (Scope scope = Scope.newNativeScope()) { Array<Integer> array = scope.allocateArray(NativeTypes.INT, new int[] { 23, 15, 4, 16, 42, 8 }); System.out.println(totalizer.sum(array.elementPointer(), 3)); } } }
рдЬрд╛рд╡рд╛ рдХреЛрдб рдореЗрдВ рдПрдХ рд╕рд╛рде рдХрдИ рдирдП рддрддреНрд╡ рджрд┐рдЦрд╛рдИ рджрд┐рдП -
Scope
,
Array
рдФрд░
Pointer
ред рджреЗрд╢реА рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдСрдл-рд╣рд╛рдЗрдк рдбреЗрдЯрд╛ рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рд░рд┐рд▓реАрдЬрд╝ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХрддрд╛ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреА рд╣реЛрдЧреАред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЗрди рд╕рднреА рдЪрд┐рдВрддрд╛рдУрдВ рдХрд╛ рдЦреНрдпрд╛рд▓ рд░рдЦрддреЗ рд╣реБрдП
Scope
ред рдЗрд╕рдХреА рд╡рд┐рдзрд┐рдпрд╛рдБ рдЕрдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реНрдореГрддрд┐, рд╕рд░рдгрд┐рдпреЛрдВ, рд╕рдВрд░рдЪрдирд╛рдУрдВ, рдФрд░ C- рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рддреА рд╣реИрдВ, рдЗрд╕ рдореЗрдореЛрд░реА рдХреЛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреА рд╣реИрдВ, рдФрд░ рдХреЛрд╢рд┐рд╢ рдХреЗ рд╕рд╛рде-рд╕рдВрд╕рд╛рдзрди рдмреНрд▓реЙрдХ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдореБрдХреНрдд рдХрд░ рджреЗрддреА рд╣реИрдВ рдФрд░ рдмрдирд╛рдП рдЧрдП рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓ рджреЗрддреА рд╣реИрдВ рддрд╛рдХрд┐ рдХреЙрд▓ рдпрд╣ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЗ рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рди рд╣реЛрдХрд░ рдЕрдкрд╡рд╛рдж рдХрд╛ рдХрд╛рд░рдг рдмрдирд╛ред
рд╕рдВрд░рдЪрдирд╛рдУрдВ рдФрд░ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдХрд╛рдо рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдЙрджрд╛рд╣рд░рдг рдХреЛ рдереЛрдбрд╝рд╛ рдФрд░ рдЬрдЯрд┐рд▓ рдХрд░реЗрдВред
mover.h #ifndef _ADDER_H #define _ADDER_H typedef struct { int x; int y; } Point; __declspec(dllexport) void move(Point*); #endif
mover.c #include "mover.h" __declspec(dllexport) void move(Point *point) { point->x = 4; point->y = 2; }
App.java import java.foreign.Library; import java.foreign.Libraries; import java.foreign.Scope; import java.foreign.annotations.NativeHeader; import java.foreign.annotations.NativeFunction; import java.foreign.annotations.NativeStruct; import java.foreign.annotations.NativeGetter; import java.foreign.memory.LayoutType; import java.foreign.memory.Pointer; import java.foreign.memory.Struct; import java.lang.invoke.MethodHandles; public class App { @NativeStruct("[i32(x) i32(y)](Point)") interface Point extends Struct<Point> { @NativeGetter("x") int x(); @NativeGetter("y") int y(); } @NativeHeader interface Mover { @NativeFunction("(u64:[i32 i32])v") void move(Pointer<Point> point); } public static void main(String[] args) { Library lib = Libraries.loadLibrary(MethodHandles.lookup(), "mover"); Mover mover = Libraries.bind(Mover.class, lib); try (Scope scope = Scope.newNativeScope()) { Pointer<Point> point = scope.allocate( LayoutType.ofStruct(Point.class)); mover.move(point); System.out.printf("X: %d Y: %d%n", point.get().x(), point.get().y()); } } }
рдпрд╣рд╛рдВ рд░реБрдЪрд┐ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреИрд╕реЗ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдХреИрд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ ldl рдШреЛрд╖рдгрд╛ рдореЗрдВ рдПрдХ рдирдпрд╛ рддрддреНрд╡ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рд╣реИ - рд▓реЗрдмрд▓ рдХреЗ рдмрд╛рдж рдХреЛрд╖реНрдардХ рдореЗрдВ рдорд╛рдиред рдпрд╣ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдк рдореЗрдВ рдПрдХ рдЯреИрдЧ рдПрдиреЛрдЯреЗрд╢рди рд╣реИред рдкреВрд░реНрдг рд░реВрдк рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
i32(name=x)
ред рд▓реЗрдмрд▓ рдПрдиреЛрдЯреЗрд╢рди рдЖрдкрдХреЛ рдЗрд╕реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐ рд╕реЗ рд╕рд╣рд╕рдВрдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рд╢реАрд░реНрд╖рдХ рдореЗрдВ рд╡рд╛рджреЗ рдкрд░ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рджреЗрд╢реА рдХреЛрдб рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реИред рдкрд┐рдЫрд▓реЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рджреЗрд╢реА рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рджреЗрд╢реА рдХреЛрдб рдХреЛ рдЬрд╛рд╡рд╛ рдХреЛрдб рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдо
qsort
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рд╕рд░рдгреА рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдХреЙрд▓рдмреИрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
import java.foreign.Library; import java.foreign.Libraries; import java.foreign.NativeTypes; import java.foreign.Scope; import java.foreign.annotations.NativeHeader; import java.foreign.annotations.NativeFunction; import java.foreign.annotations.NativeCallback; import java.foreign.memory.Array; import java.foreign.memory.Callback; import java.foreign.memory.Pointer; import java.lang.invoke.MethodHandles; public class App { @NativeHeader interface StdLib { @NativeFunction("(u64:[0i32] i32 i32 u64:(u64:i32 u64:i32) i32)v") void qsort(Pointer<Integer> base, int nitems, int size, Callback<QComparator> comparator); @NativeCallback("(u64:i32 u64:i32)i32") interface QComparator { int compare(Pointer<Integer> p1, Pointer<Integer> p2); } } public static void main(String[] args) { Library lib = Libraries.loadLibrary(MethodHandles.lookup(), "msvcr120"); StdLib stdLib = Libraries.bind(StdLib.class, lib); try (Scope scope = Scope.newNativeScope()) { Array<Integer> array = scope.allocateArray(NativeTypes.INT, new int[] { 23, 15, 4, 16, 42, 8 }); Callback<StdLib.QComparator> cb = scope.allocateCallback( (p1, p2) -> p1.get() - p2.get()); stdLib.qsort(array.elementPointer(), (int) array.length(), Integer.BYTES, cb); for (int i = 0; i < array.length(); i++) { System.out.printf("%d ", array.get(i)); } System.out.println(); } } }
рдпрд╣ рджреЗрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ ldl рд╡рд┐рдЬреНрдЮрд╛рдкрди, рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкрдврд╝рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИрдВ, рдЬрд▓реНрджреА рд╕реЗ рдЙрдЧреНрд░ рдбрд┐рдЬрд╛рдЗрдиреЛрдВ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди
qsort
рд╕рдмрд╕реЗ рдХрдард┐рди рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рджрд░реНрдЬрдиреЛрдВ рд╕рдВрд░рдЪрдирд╛рдПрдВ рдФрд░ рджрд░реНрдЬрдиреЛрдВ рдХрд╛рд░реНрдп рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рд▓рд┐рдЦрдирд╛ рдПрдХ рдзрдиреНрдпрд╡рд╛рдж рдХрд╛рд░реНрдп рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рджреЛрдиреЛрдВ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ
jextract
рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛
jextract
рд╣реИ, рдЬреЛ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ред рдЖрдЗрдП рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рдЗрд╕ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рд╕рд╛рде рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдВред
jextract -L . -l adder -o adder.jar -t "com.example" adder.h
рдФрд░ рдЬрд╛рд╡рд╛ рдХреЛрдб рдмрдирд╛рдиреЗ рдФрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдореА рдЬрд╛рд░ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
javac -cp adder.jar Example.java java -cp .;adder.jar Example
рдЬрдмрдХрд┐ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдФрд░ рдЕрдм python37.dll (рдЕрдВрдд рдореЗрдВ!) рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рд╣реА рдХрд░реЗрдВред
import java.foreign.Scope; import java.foreign.memory.Pointer; import static org.python.Python_h.*; import static org.python.pylifecycle_h.*; import static org.python.pythonrun_h.*; public class App { public static void main(String[] args) { Py_Initialize(); try (Scope s = Scope.newNativeScope()) { PyRun_SimpleStringFlags( s.allocateCString("print(sum([23, 15, 4, 16, 42, 8]))\n"), Pointer.nullPointer()); } Py_Finalize(); } }
рд╣рдо рдЗрдВрдЯрд░рдлреЗрд╕ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ:
jextract -L "C:\Python37" -l python37 -o python.jar -t "org.python" --record-library-path C:\Python37\include\Python.h
рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЪрд▓рд╛рдПрдВ:
javac -cp python.jar App.java java -cp .;python.jar App
рдмрдзрд╛рдИ рд╣реЛ, рдЖрдкрдХреЗ рдЬрд╛рд╡рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдиреЗ рдкрд╛рдпрдерди рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдФрд░ рдЙрд╕рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреА!
рдЕрдЧреНрд░рджреВрддреЛрдВ рдХреЗ
рдирд┐рд░реНрджреЗрд╢реЛрдВ рдореЗрдВ рдЕрдзрд┐рдХ рдЙрджрд╛рд╣рд░рдг рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реЗрдЦ рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдорд╛рд╡реЗрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ
рдХреЛ GitHub рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИ ред
рдкреАрдПрд╕ рдПрдкреАрдЖрдИ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдмрджрд▓рд╛рд╡ рдХреЗ рджреМрд░ рд╕реЗ рдЧреБрдЬрд░ рд░рд╣рд╛ рд╣реИред рдХреБрдЫ рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ рдХреА рдкреНрд░рд╕реНрддреБрддрд┐рдпреЛрдВ рдореЗрдВ, рдЙрд╕ рдХреЛрдб рдХреЛ рджреЗрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдЬреЛ рд╕рдВрдХрд▓рди рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рд╕реЗ рдкреНрд░рддрд┐рд░рдХреНрд╖рд╛ рдирд╣реАрдВ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЗрд╕ рдкрд░ рдЖрддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬреЗрдВ, рдореИрдВ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ред