рдЬрд╛рд╡рд╛ рдиреЗрдЯрд┐рд╡ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реА ++ред рд▓рд┐рдирдХреНрд╕ред рдкрд╣рд▓рд╛ рдХрджрдо

рдПрдХ рд╣рдм рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдорд╛рди рд▓реЗрдЦ рдереЗ, рд▓реЗрдХрд┐рди рд╡рд┐рдВрдбреЛрдЬ рдФрд░ рдореЗрд░реЗ рдЬреИрд╕реЗ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП "рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ"ред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЦреЛрдЬ рдЗрдВрдЬрди рдкрд░ рдареЛрдХрд░ рдФрд░ рдмреИрдардирд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдореЗрд░реЗ рд╕рд╛рде рд╣реБрдЖ рдерд╛ред

рдЬрд╛рд╡рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ C / C ++ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдФрд░ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рд░ рдХреЛрдИ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рд╛рде рдЖрдПрдЧрд╛, рдореИрдВ рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреВрдВрдЧрд╛, рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдХрд┐рд╕реА рднреА рдЙрдкрдХрд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдРрд╕рд╛ рдмрдВрдбрд▓ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЛ рднреА рдирд╣реАрдВ рдЫреВрдКрдВрдЧрд╛, рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ (рдЬреИрд╕реЗ рдХрд┐ рдЬрд┐рдВрдЯ рдпрд╛ рдЬреЗрдбрдбрдмреНрд▓реВ) рдореВрд▓ рд▓реЛрдЧреЛрдВ рд╕реЗ рд╕реА ++ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рдЕрд▓рдЧ рд╣реИрдВред

рдФрд░ рдРрд╕рд╛ рд╣реИред рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд╣рдо C ++ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЫрд╡рд┐ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдмрд┐рд▓реНрд▓реА рдХреЗ рдмрдЪреНрдЪреЗ рдХреА рд╕рдВрдЦреНрдпрд╛ рджреЗрддрд╛ рд╣реИред рдлрд┐рд░ рд╣рдо рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рднрд░реА рд╣реБрдИ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рдЬрд╛рд╡рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╡реАрдХреЗ рд╕реЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЪрд┐рддреНрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддрд╛ рд╣реИред рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред

рдХрдиреЗрдХреНрдЯреЗрдб рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рд╡рд░реНрдЧ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдореВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рд╣реЗрдбрд░ рдлрд╛рдЗрд▓ рдЬрд┐рд╕рдореЗрдВ рдлрдВрдХреНрд╢рди рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╣реЛрдВрдЧреЗ рдЬрд┐рд╕рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реЛрдВрдЧреЗред

NativeCode.java
public class NativeCode { //            loadLibrary //        NativeCode static { System.loadLibrary( "nativecode" ); } public NativeCode() { //   srand    srand(); } //      public native int getInt(); //     int public native void showInt(int i); //     int public native void showIntArray(int[] array); //    public native int getRandomInt(); //       public native void addOneToArray(int[] array); private native void srand(); } 



рд╕рдВрдХрд▓рд┐рдд рд╡рд░реНрдЧ рдлрд╝рд╛рдЗрд▓ рд╕реЗ javah рдЙрдкрдпреЛрдЧрд┐рддрд╛ рджреНрд╡рд╛рд░рд╛ рд╣реИрдбрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

 javac NativeCode.java javah -jni -o NativeCode.h NativeCode 


NativeCode.h
 /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class by_framework_nativeapp_NativeCode */ #ifndef _Included_by_framework_nativeapp_NativeCode #define _Included_by_framework_nativeapp_NativeCode #ifdef __cplusplus extern "C" { #endif /* * Class: by_framework_nativeapp_NativeCode * Method: getInt * Signature: ()I */ JNIEXPORT jint JNICALL Java_by_framework_nativeapp_NativeCode_getInt (JNIEnv *, jobject); /* * Class: by_framework_nativeapp_NativeCode * Method: showInt * Signature: (I)V */ JNIEXPORT void JNICALL Java_by_framework_nativeapp_NativeCode_showInt (JNIEnv *, jobject, jint); /* * Class: by_framework_nativeapp_NativeCode * Method: showIntArray * Signature: ([I)V */ JNIEXPORT void JNICALL Java_by_framework_nativeapp_NativeCode_showIntArray (JNIEnv *, jobject, jintArray); /* * Class: by_framework_nativeapp_NativeCode * Method: getRandomInt * Signature: ()I */ JNIEXPORT jint JNICALL Java_by_framework_nativeapp_NativeCode_getRandomInt (JNIEnv *, jobject); /* * Class: by_framework_nativeapp_NativeCode * Method: addOneToArray * Signature: ([I)V */ JNIEXPORT void JNICALL Java_by_framework_nativeapp_NativeCode_addOneToArray (JNIEnv *, jobject, jintArray); /* * Class: by_framework_nativeapp_NativeCode * Method: srand * Signature: ()V */ JNIEXPORT void JNICALL Java_by_framework_nativeapp_NativeCode_srand (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif 



рдмреЗрд╣рддрд░ рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рди рдЫреВрдПрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рджреМрд░рд╛рди рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред рдмрд╕ рдЗрд╕реЗ рдПрдХ рд╕реАрдкреАрдкреА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ рдФрд░ рд╡рд╣рд╛рдВ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ, рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдФрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдЧрдбрд╝рдмрдбрд╝ рд╣реИ, рдЗрд╕ рдЖрдИрдбреАрдИ рдХреА рдирдХрд▓ рдпрд╛ рдирд┐рд░реНрджреЗрд╢ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред

NativeCode.cpp
 #include <iostream> #include <ctime> #include <cstdlib> #include <iomanip> #include "NativeCode.h" JNIEXPORT jint JNICALL Java_by_framework_nativeapp_NativeCode_getInt (JNIEnv *enc, jobject obj) { int input = 1; std::cout<<"Input number: "; std::cin>>input; if(input<0) input = 0; return input; } JNIEXPORT void JNICALL Java_by_framework_nativeapp_NativeCode_showInt (JNIEnv *env, jobject obj, jint i) { std::cout<<"Output number: "<<i<<std::endl; } JNIEXPORT void JNICALL Java_by_framework_nativeapp_NativeCode_showIntArray (JNIEnv *env, jobject obj, jintArray jarray) { int len = env->GetArrayLength(jarray); std::cout<<"Array length: "<<len<<std::endl; jint* arr = env->GetIntArrayElements(jarray, 0); for(int i = 0; i < len; i++) { std::cout<<std::setw(5)<<i<<": "<<std::setw(4)<<arr[i]<<std::endl; } env->ReleaseIntArrayElements(jarray, arr, 0); } JNIEXPORT jint JNICALL Java_by_framework_nativeapp_NativeCode_getRandomInt (JNIEnv *env, jobject obj) { int i = rand()%100; return i; } JNIEXPORT void JNICALL Java_by_framework_nativeapp_NativeCode_addOneToArray (JNIEnv *env, jobject obj, jintArray jarray) { int len = env->GetArrayLength(jarray); jint* arr = env->GetIntArrayElements(jarray, 0); for(int i = 0; i < len; i++) { ++(*(arr+i)); } // .. GetIntArrayElements    ,  //    Java   env->ReleaseIntArrayElements(jarray, arr, 0); } JNIEXPORT void JNICALL Java_by_framework_nativeapp_NativeCode_srand (JNIEnv *env, jobject obj) { srand(time(NULL)); } 



рд╣рдо рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВред
 g++ -o libnativecode.o -I"/usr/lib/jvm/java-1.7.0-openjdk-amd64/include" -I"/usr/lib/jvm/java-1.7.0-openjdk-amd64/include/linux" -fpic -c NativeCode.cpp g++ -o libnativecode.so -shared libnativecode.o 


рдЙрдЪрд┐рдд рд╕рдВрдХрд▓рди рдХреЗ рд▓рд┐рдП -fpic -c -saded рдзреНрд╡рдЬ рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред

рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдирд╛рдо рдЯреЗрдореНрдкрд▓реЗрдЯ рд▓рд┐рдмрд╛рд╕ [рдирд╛рдо] рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реЛред рдЗрд╕рд▓рд┐рдП , рдЬреЛ рд▓реЛрдЧ рд▓рд┐рдирдХреНрд╕ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдореИрдВ рд╕рдмрд╕реЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд▓рдЯрдХрд╛ рд░рд╣рд╛, рдХреНрдпреЛрдВрдХрд┐ win32 рдХреЗ рд▓рд┐рдП рдореМрдЬреВрджрд╛ рд▓реЗрдЦреЛрдВ рдореЗрдВ рдПрдХ рд╢рдмреНрдж рдЙрдкрд╕рд░реНрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИред

рдпрд╣ рдореБрдЦреНрдп рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдЬрд╛рд╡рд╛ рдореЗрдВ рдПрдХ рд╡рд░реНрдЧ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ, рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓рд╛рдПрдВред

AppClass.java
 public class AppClass { public static void main(String[] args) { //    NativeCode     //     NativeCode nc = new NativeCode(); int i = nc.getInt(); nc.showInt(++i); int[] array = new int[i]; //     for(int j = 0; j < i; j++) { array[j] = nc.getRandomInt(); } nc.showIntArray(array); nc.addOneToArray(array); nc.showIntArray(array); } } 



 javac AppClass.java 


рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдореЗрдВ, рд╣рдо рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЛ рдбрд╛рдпрдирд╛рдорд┐рдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдХреЗ рд▓рд┐рдП рд░рд╛рд╕реНрддрд╛ рдмрддрд╛рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдпрд╣ рдХреЗрд╡рд▓ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рд░рд╛рд╕реНрддреЛрдВ рд╕реЗ рдЦреЛрдЬ рдХрд░реЗрдЧрд╛ред
 java -Djava.library.path="." AppClass 


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

makefile
 all : NativeCode.so NativeCode.so : NativeCode.obj g++ -o bin/libnativecode.so -shared bin/libnativecode.o NativeCode.obj: cpp_src/NativeCode.cpp java_headers g++ -o bin/libnativecode.o -I"/usr/lib/jvm/java-1.7.0-openjdk-amd64/include" -I"/usr/lib/jvm/java-1.7.0-openjdk-amd64/include/linux" -fpic -c cpp_src/NativeCode.cpp java_headers: java_class_files javah -jni -o cpp_src/NativeCode.h -classpath bin by.framework.nativeapp.NativeCode java_class_files: src/by/framework/nativeapp/NativeCode.java src/by/framework/nativeapp/AppClass.java mkdir -p bin javac -d bin -cp bin src/by/framework/nativeapp/NativeCode.java javac -d bin -cp bin src/by/framework/nativeapp/AppClass.java 



рдЖрдк GitHub рдкрд░ рд╕рднреА рдХреЛрдб рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

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


All Articles