рдЬрд╛рд╡рд╛ рдФрд░ ... рдХреЗ рд╕рдВрдпреЛрдЬрди

рдЬрд╛рд╡рд╛ рдореЗрдВ, рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд▓рд╛рдЧреВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рддрдерд╛рдХрдерд┐рдд рдЬреЗрдПрдирдЖрдИ ред рдЖрдк рдПрдХ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЬреБрдбрд╝реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЗрд╕реЗ рдЬрд╛рд╡рд╛ рдХреЛрдб рдореЗрдВ рд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣рд╛рдВ рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдХрдХреНрд╖рд╛ рдХреЗ рдореВрд▓ рддрд░реАрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕реЗ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВред рдЬреЗрдПрдирдЖрдИ рдХреЛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдорд╢реАрди-рдЖрд╢реНрд░рд┐рдд рдХрд╛рд░реНрдпреЛрдВ (рдФрд░, рд╕рдВрднрд╡рддрдГ, рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рдЧрддрд┐-рдорд╣рддреНрд╡рдкреВрд░реНрдг рднрд╛рдЧреЛрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░) рдХреЗ рд▓рд┐рдП C / C ++ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдХреЛрдИ рд╣рдореЗрдВ рдЕрд╕реЗрдВрдмрд▓рд░ рдореЗрдВ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓рд┐рдЦрдиреЗ рд╕реЗ рднреА рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдЙрдкрдХрд░рдг


рдЗрд╕ рд╡рд┐рдХреГрддрд┐ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ Windows, Oracle JDK, Yasm (macros рдХреЗ рдмрд┐рдирд╛) рдФрд░ Microsoft Visual Studio 2010 рдХреЗ рд▓рд┐рдВрдХрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рдереЗ, рддреЛ рдЗрди рдШрдЯрдХреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЛ рднреА рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рдХреЗ рд╕рд╛рде рдмрджрд▓рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдореИрдВрдиреЗ рдХреЛрд╢рд┐рд╢ рдХреА рдХрд┐ рдореИрдВ рдЕрдкрдиреЗ рдЧреИрд░-рдорд╛рдирдХ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реВрдВред

JNI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЪрд▓рд┐рдП рдЬрд╛рд╡рд╛ рдореЗрдВ рдПрдХ рдХреНрд▓рд╛рд╕ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рднрд╡рд┐рд╖реНрдп рд╕реЗ рдПрдХ рдХрд╛рд░реНрдпред Dll рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛:

public class TestJNI { native static int sum(int x, int y); //   sum public static void main(String[] args) { System.loadLibrary("mydll"); //   mydll.dll System.out.println(sum(2, 3)); //   } } 


рдЬрд╛рд╡рд╛ рдореЗрдВ рдирд╛рдо рдордВрдЧрд▓рд┐рдВрдЧ


рдЕрдм рдЖрдкрдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЬрд╛рд╡рд╛ рдорд╢реАрди рдореЗрдВ рдХрд┐рд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо рд╣рдорд╛рд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдЦреЛрдЬрдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИред рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП JDK рд╕реЗ рдЬрд╛рд╡рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:

javac TestJNI.java
javah TestJNI


рдпрд╣ C ++ рд╢реАрд░реНрд╖рд▓реЗрдЦ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛:
 /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class TestJNI */ #ifndef _Included_TestJNI #define _Included_TestJNI #ifdef __cplusplus extern "C" { #endif /* * Class: TestJNI * Method: sum * Signature: (II)I */ JNIEXPORT jint JNICALL Java_TestJNI_sum (JNIEnv *, jclass, jint, jint); #ifdef __cplusplus } #endif #endif 


рд╕реА ++ рдореЗрдВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЖрдЧреЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдпрд╣рд╛рдВ рджреА рдЧрдИ рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ:

 JNIEXPORT jint JNICALL Java_TestJNI_sum (JNIEnv *, jclass, jint, jint); 


рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ dll рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо JNICALL Java_TestJNI_sum рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ 4 рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрдиреЗ рдЪрд╛рд╣рд┐рдПред рд╕рдмрд╕реЗ рд╕рд░рд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЙрдирдореЗрдВ рд╕реЗ рдкрд╣рд▓реЗ рджреЛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред JNIEXPORT рдЬреИрд╕реЗ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдЬреАрдм рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, jni.h рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдЬреЛ JDK рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред

рдХреЛрдбрд╛рдВрддрд░рдХ


рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓рд┐рдЦреЗрдВ:

 ;mydll.asm section .text global Java_TestJNI_sum Java_TestJNI_sum: mov eax, [esp + 12] ;   2  add eax, [esp + 16] ret 16 end 


 ;mydll.def LIBRARY mydll EXPORTS Java_TestJNI_sum 


рд╕рдВрдХрд▓рди рдФрд░ рд▓рд┐рдВрдХ:
yasm -f win32 mydll.asm
link /SUBSYSTEM:windows /DLL /NOENTRY /DEF:mydll.def mydll.obj


рдЖрдЙрдЯрдкреБрдЯ рдкрд░, рд╣рдореЗрдВ рдПрдХ .dll рдлрд╝рд╛рдЗрд▓ рдорд┐рд▓рддреА рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рдЬрд╛рд╡рд╛ рдХреЛрдб рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдкрд░рд┐рдгрд╛рдо


рд╣рдордиреЗ рдлрд╝рд╛рдЗрд▓реЗрдВ mydll.dll рдФрд░ TestJNI.class рдХреЛ рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд░рдЦрд╛ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реБрдЖ:

>java TestJNI
5


рдпрд╣ рдПрдХ рдЬреАрдд рд╣реИ, рд╣рдордиреЗ рд╕реАрдЦрд╛ рдХрд┐ рджреЛ рдирдВрдмрд░ рдХреИрд╕реЗ рдЬреЛрдбрд╝реЗ!

рдпрджрд┐ рдХрд┐рд╕реА рдХреЛ рдЕрдЪрд╛рдирдХ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛ рдЧрдИ, рддреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд┐рдВрдХ рдХрд╛рдо рдЖрдПрдВрдЧреЗ:

Source: https://habr.com/ru/post/In145804/


All Articles