Android는 C ++ (NDK) 및 Java (SDK) 언어를 지원합니다. C ++ 언어를 사용하는 경우 C ++ 코드 및 Java와 상호 작용하는 것이 특히 중요합니다. 다운로드 된 NDK 패키지에서 샘플/hello-jni가 참조 할 간단한 예가 있습니다.
Java는 C ++를 호출합니다
새로운 Android 프로젝트를 만들고 다음 수업을 만듭니다.
package com.example.testjni; public class textjni {// c static {system.loadlibrary ( "jniinterface"); } public static native int getInt (); public static native string getstring ();}상기는 두 가지 기본 방법을 선언하는데,이 방법은 getint 및 getstring의 메소드 구현이 C ++ (libjniinterface.so)로 제공 될 것임을 나타냅니다.
클래스 디렉토리에서 다음 명령을 실행하여 기본에 해당하는 구현 파일을 생성하십시오.
javah com.example.testjni.textjni # android sdk 클래스를 원한다면 javah -classpath /users/richard/dev/android/sdk/platforms/android-19/android.jar:./bin/classes com.togic.gameengine.gameengine.gameengine을 지정해야합니다.
헤더 파일을 생성하고 복사하고 JNI 폴더를 만들고 CPP 구현 파일을 만듭니다.
com_example_testjni_textjni.cpp : #include <stdio.h> #include <stdlib.h> #include "com_example_testjni_textjni.h"int sum () {int x, y; x = 100; y = 1000; x += y; return x;} // com_example_textjni_textjni.h jniexport jint jincall java_com_example_testjni_textjni_getint (jnienv * env, jclass cls) {return sum ();} jniexport jnicall java_com_example_testjni_textjni_getstring (jnienv * env, jclass cls) {return env-> newstringutf ( "hellondk!");}C ++ 코드를 구성하려면 교차 컴파일이 여기에서 사용되며 Android.mk는 필요합니다.
jni/ 아래에 새 Android.mk 파일 생성
android.mk:local_path : = $ (my-dir)는 $ (clare_vars) local_module : = jniinterfacelocal_src_files 포함 : = com_example_testjni_textjni.cpp#local_c_includes : = $ (local_path) 포함.
그런 다음 NDK : NDK-Build의 도구를 사용하여 동적 링크 라이브러리를 생성 할 수 있습니다 : libjniinterface.so
생성 된 라이브러리 파일은 이전 Java 파일에서 호출 할 수 있습니다.
C ++ 호출 Java
위의 예에서 JNI를 사용하여 GetString 메소드에서 Java를 호출 할 수 있습니다.
jniexport JString Jnicall Java_com_togic_testjni2_textjni_getstring (jnienv * env, jclass cls) {jclass textjni; jobject insttextjni; jmethodid getCurrint; jnienv* jnienv = env; TextJni = jnienv-> findclass ( "com/togic/testjni2/textjni"); jmethodid construction_id = jnienv-> getMethodid (TextJni, "init", "() v"); insttextjni = jnienv-> newObject (textJni, construction_id); getCurrint = jnienv-> getStaticMethodid (TextJni, "getCurrint", "() I"); // 호출 java static 메소드 Jint Jiref = jnienv-> callstaticintmethod (textjni, getCurrint); // 청소 jnienv-> deletelocalref (textjni); jnienv-> deletelocalref (insttextjni); std :: String strref = "hellondk!" + view-> getStatictring (); return env-> newstringutf (strref.c_str ());}우선, JNI.H의 기능은 C와 C ++ 언어를 구별한다는 점에 주목할 가치가 있습니다. C ++의 경우 다음은 일반적으로 다음과 같습니다.
jclass clazz = env-> findclass (className);
그리고 C :
jclass clazz = (*env)-> findclass (Env, ClassName);
getMethodid의 세 번째 매개 변수는 다음과 같이 얻을 수있는 방법 시그니처를 나타냅니다.
Javap -S 패키지 이름. 클래스 이름은 메소드의 서명을 가져옵니다
첨부 된 JNI 데이터 유형 변환
Jstring to Char *
const char nativestring = (ENV)-> getStringutfchars (Env, Javastring, 0);
ReleasestringUtfchars ()에 의해 해제 될 때까지 유효하게 유지되는 문자열의 UTF-8 문자 배열에 대한 포인터를 반환합니다.
(*env)-> reengestringutfchars (Env, Javastring, nativestring);
char * jstring에
jstring jstr = (Env)-> Newstringutf (Env, Char UTF)
UTF-8 문자 배열을 사용하여 새로운 java.lang.string 객체를 구성하십시오.
기타 유형 모든 사본을 메모에 선택하십시오 Java Type Local C 유형 설명
부울 jboolean 부호없는, 8 비트
바이트 jbyte 서명, 8 비트
숯 JCHAR 서명, 16 비트
짧은 jshort 서명, 16 비트
Int Jint가 서명, 32 비트
긴 Jlong 서명, 64 비트
플로트 jfloat 32 비트
이중 Jdouble 64 비트
void void n/a