ãã®èšäºã¯ãAndroid NDKã«ãŸã 粟éããŠããªãïŒãŸãã¯ããŸã粟éããŠããªãïŒäººã ã察象ãšããŠãããç¥èã匷åããããšèããŠããŸãã ãã®ã€ã³ã¿ãŒãã§ãŒã¹ããå§ããå¿ èŠãããããã«æããã®ã§ãç§ã¯JNIã«æ³šæãæããŸãã ãŸããæåŸã«ããã¡ã€ã«ã®æžã蟌ã¿ãšèªã¿åãã®ããã®2ã€ã®é¢æ°ã䜿çšããå°ããªäŸãæ€èšããŸãã å€ãã®ããã¹ãã奜ãã§ã¯ãªã人ã¯ã圌ã¯ãããªçãèŠãããšãã§ããŸãã
Android NDKãšã¯äœã§ããïŒ
Android NDK ïŒãã€ãã£ãéçºãããïŒã¯ãC / C ++ãªã©ã®èšèªã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ã®äžéšãå®è£ ã§ããããŒã«ã®ã»ããã§ãã
NDKã¯äœã«äœ¿çšãããŸããïŒ
Googleã§ã¯ããŸãã«ããNDKã䜿çšããªãããšãæšå¥šããŠããŸãã å€ãã®å Žåããããã¯ã±ãŒã¹ã§ãïŒ
- çç£æ§ãé«ããå¿ èŠããããŸãïŒããšãã°ã倧éã®ããŒã¿ã䞊ã¹æ¿ããïŒã
- ãµãŒãããŒãã£ã®ã©ã€ãã©ãªã䜿çšããŸãã ããšãã°ããã§ã«å€ãã®èšèªãC / C ++èšèªã§èšè¿°ãããŠãããæ¢åã®çŽ æã䜿çšããã ãã§æžã¿ãŸãã FfmpegãOpenCVãªã©ã®ã©ã€ãã©ãªã®äŸã
- äœã¬ãã«ã®ããã°ã©ãã³ã°ïŒããšãã°ãDalvikãè¶ ãããã¹ãŠïŒ;
JNIãšã¯äœã§ããïŒ
Java Native Interface -Javaä»®æ³ãã·ã³ãå®è¡ããã³ãŒããå®è¡ããããã®æšæºã¡ã«ããºã ãC/ C ++ãŸãã¯ã¢ã»ã³ãã©ãŒã§èšè¿°ãããåçã©ã€ãã©ãªã®åœ¢åŒã§é 眮ãããŠãããããéçãªã³ã¯ãäžèŠã§ãã ããã«ãããJavaããã°ã©ã ããC / C ++é¢æ°ãåŒã³åºãããšãã§ãããã®éãå¯èœã§ãã
JNIã®å©ç¹
ã¢ããã°ïŒNetscape Java Runtime InterfaceãŸãã¯Microsoftã®Raw Native Interfaceããã³COM / Java InterfaceïŒã«å¯Ÿããäž»ãªå©ç¹ã¯ãJNIãå ã ãJNIã§èšè¿°ãããã¢ããªã±ãŒã·ã§ã³ã®äºææ§ã®ããã«ãç¹å®ã®ãã©ãããã©ãŒã äžã®Javaä»®æ³ãã·ã³ã«å¯ŸããŠãã€ããªäºææ§ãæäŸããããã«èšèšãããããšã§ãJNIã«ã€ããŠè©±ããŠããã®ã§ãããDalvikãã·ã³ã«ã¯æ¥ç¶ããŸãããJNIã¯ããã¹ãŠã®Javaä»®æ³ãã·ã³ã«é©ããJVMçšã«Oracleã«ãã£ãŠäœæãããããã§ãã ãããã£ãŠãã³ã³ãã€ã«ãããC / C ++ã³ãŒãã¯ããã©ãããã©ãŒã ã«é¢ä¿ãªãå®è¡ãããŸãã 以åã®ããŒãžã§ã³ã§ã¯ããã€ããªäºææ§ãèš±å¯ãããŠããŸããã§ããã
ãã€ããªäºææ§ãŸãã¯ãã€ããªäºææ§ã¯ãããã°ã©ã ãå®è¡å¯èœãã¡ã€ã«ãå€æŽããã«ç°ãªãç°å¢ã§åäœã§ããããã«ããããã°ã©ã äºææ§ã®äžçš®ã§ãã
JNIã®ä»çµã¿
C ++ã®ä»®æ³é¢æ°ã®ããŒãã«ãšããŠç·šæãããJNIããŒãã«ã VMã¯ããã®ãããªããŒãã«ãããã€ã䜿çšã§ããŸãã ããšãã°ã1ã€ã¯ãããã°çšã2ã€ç®ã¯äœ¿çšçšã§ãã JNIã€ã³ã¿ãŒãã§ãŒã¹ãžã®ãã€ã³ã¿ãŒã¯ãçŸåšã®ã¹ã¬ããã§ã®ã¿æå¹ã§ãã ããã¯ããã€ã³ã¿ãŒãã¹ããªãŒã éã移åã§ããªãããšãæå³ããŸãã ãã ãããã€ãã£ãã¡ãœããã¯ç°ãªãã¹ã¬ããããåŒã³åºãããšãã§ããŸãã äŸïŒ
jdouble Java_pkg_Cls_f__ILjava_lang_String_2 (JNIEnv *env, jobject obj, jint i, jstring s) { const char *str = (*env)->GetStringUTFChars(env, s, 0); (*env)->ReleaseStringUTFChars(env, s, str); return 10; }
- * env-ã€ã³ã¿ãŒãã§ã€ã¹ãžã®ãã€ã³ã¿ãŒã
- obj-ãã€ãã£ãã¡ãœãããèšè¿°ãããŠãããªããžã§ã¯ããžã®åç §ã
- iãšsã«ã¯åŒæ°ãæž¡ââãããŸãã
ããªããã£ãåã¯VMãšãã€ãã£ãã³ãŒãã®éã§ã³ããŒããããªããžã§ã¯ãã¯åç §ã«ãã£ãŠæž¡ãããŸãã VMã¯ããã€ãã£ãã³ãŒãã«è»¢éããããã¹ãŠã®ãªã³ã¯ã远跡ããå¿ èŠããããŸãã ãã€ãã£ãã³ãŒããžã®ãã¹ãŠã®è»¢éããããªã³ã¯ã¯ãGCã«ãã£ãŠè§£æŸã§ããŸããã ãã ãããã€ãã£ãã³ãŒãã¯ãæž¡ããããªããžã§ã¯ããžã®åç §ãäžèŠã«ãªã£ãããšãVMã«éç¥ããå¿ èŠããããŸãã
ããŒã«ã«ããã³ã°ããŒãã«ãªã³ã¯
JNIã¯ããªã³ã¯ã3ã€ã®ã¿ã€ãïŒããŒã«ã«ãã°ããŒãã«ãããã³åŒ±ãã°ããŒãã«ãªã³ã¯ïŒã«åå²ããŸãã ããŒã«ã«ã®ãã®ã¯ãã¡ãœãããå®äºãããŸã§æå¹ã§ãã JNIé¢æ°ãè¿ããã¹ãŠã®Javaãªããžã§ã¯ãã¯ããŒã«ã«ã§ãã ããã°ã©ãã¯ãVMèªäœããã¹ãŠã®ããŒã«ã«ãªã³ã¯ãã¯ãªãŒã³ã¢ããããããšãæåŸ ããå¿ èŠããããŸãã ããŒã«ã«ãªã³ã¯ã¯ãäœæãããã¹ããªãŒã ã§ã®ã¿äœ¿çšã§ããŸãã ãã ããå¿ èŠãããå Žåã¯ãDeleteLocalRefã€ã³ã¿ãŒãã§ã€ã¹ã®JNIã¡ãœããã䜿çšããŠããã«è§£æŸã§ããŸãã
jclass clazz; clazz = (*env)->FindClass(env, "java/lang/String"); // (*env)->DeleteLocalRef(env, clazz);
ã°ããŒãã«ãªã³ã¯ã¯ãæ瀺çã«è§£æŸããããŸã§æ®ããŸãã ã°ããŒãã«ãªã³ã¯ãç»é²ããã«ã¯ãNewGlobalRefã¡ãœãããåŒã³åºããŸãã ã°ããŒãã«ãªã³ã¯ãäžèŠã«ãªã£ãå Žåã¯ãDeleteGlobalRefã¡ãœããã䜿çšããŠåé€ã§ããŸãã
jclass localClazz; jclass globalClazz; localClazz = (*env)->FindClass(env, "java/lang/String"); globalClazz = (*env)->NewGlobalRef(env, localClazz); // (*env)->DeleteLocalRef(env, localClazz);
ãšã©ãŒåŠç
JNIã¯ãNullPointerExceptionãIllegalArgumentExceptionãªã©ã®ãšã©ãŒããã§ãã¯ããŸããã çç±ïŒ
- çç£æ§ã®äœäž;
- Cã©ã€ãã©ãªã®ã»ãšãã©ã®æ©èœã§ã¯ããšã©ãŒããå®ãããšã¯éåžžã«å°é£ã§ãã
JNIã§ã¯ãJavaäŸå€ã䜿çšã§ããŸãã ã»ãšãã©ã®JNIé¢æ°ã¯ãäŸå€èªäœã§ã¯ãªããšã©ãŒã³ãŒããè¿ããããJavaã§ã³ãŒãèªäœãåŠçããŠäŸå€ãã¹ããŒããå¿ èŠããããŸãã JNIã§ã¯ãåŒã³åºãããé¢æ°ã®ãšã©ãŒã³ãŒãã確èªãããããã®åŸã«ExceptionOccurredïŒïŒãåŒã³åºãå¿ èŠããããŸããããã«ããããšã©ãŒãªããžã§ã¯ããè¿ãããŸãã
jthrowable ExceptionOccurred(JNIEnv *env);
ããšãã°ãäžéšã®JNIé åã¢ã¯ã»ã¹é¢æ°ã¯ãšã©ãŒãè¿ããŸããããArrayIndexOutOfBoundsExceptionãŸãã¯ArrayStoreExceptionãçºçãããå ŽåããããŸãã
ããªããã£ãJNIã¿ã€ã
JNIã«ã¯ãç¬èªã®ããªããã£ãããŒã¿åãšåç §ããŒã¿åããããŸãã
Javaã¿ã€ã | ãã€ãã£ãã¿ã€ã | 説æ |
---|---|---|
ããŒã«å€ | jboolean | 笊å·ãªã8ããã |
ãã€ã | jbyte | 笊å·ä»ã8ããã |
ãã£ãŒ | jchar | 笊å·ãªã16ããã |
çã | jshort | 笊å·ä»ã16ããã |
int | ãžã³ã | 笊å·ä»ã32ããã |
é·ã | jlong | 笊å·ä»ã64ããã |
æµ®ã | jfloat | 32ããã |
ããã« | jdouble | 64ããã |
ãã€ã | ãã€ã | N / a |
JNIåç §å
å€æŽãããUTF-8
JNIã¯ãå€æŽãããUTF-8ãšã³ã³ãŒãã£ã³ã°ã䜿çšããŠæååãè¡šããŸãã 次ã«ãJavaã¯UTF-16ã䜿çšããŸãã UTF-8ã¯ãéåžžã®0x00ã§ã¯ãªãã0xc0ã§\ u0000ããšã³ã³ãŒããããããCã§äž»ã«äœ¿çšãããŸãã ãŒã以å€ã®ASCIIæåã®ã¿ãå«ãäžé£ã®æåã1ãã€ãã®ã¿ã䜿çšããŠè¡šçŸã§ããããã«ãå€æŽãããæååã¯ãšã³ã³ãŒããããŸãã
JNIé¢æ°
JNIã€ã³ã¿ãŒãã§ãŒã¹ã«ã¯ãç¬èªã®ããŒã¿ã»ããã ãã§ãªããç¬èªã®æ©èœãå«ãŸããŠããŸãã ãããã¯åæ°åããã®ã§ãããããæ€èšããã«ã¯å€ãã®æéãããããŸãã å ¬åŒããã¥ã¡ã³ãã§ãããã«ã€ããŠç¥ãããšãã§ããŸã ã
JNIé¢æ°ã®äŸ
åŠç¿ããè³æãåŠç¿ããããã®å°ããªäŸïŒ
#include <jni.h> //... JavaVM *jvm; JNIEnv *env; JavaVMInitArgs vm_args; JavaVMOption* options = new JavaVMOption[1]; options[0].optionString = "-Djava.class.path=/usr/lib/java"; vm_args.version = JNI_VERSION_1_6; vm_args.nOptions = 1; vm_args.options = options; vm_args.ignoreUnrecognized = false; JNI_CreateJavaVM(&jvm, &env, &vm_args); delete options; jclass cls = env->FindClass("Main"); jmethodID mid = env->GetStaticMethodID(cls, "test", "(I)V"); env->CallStaticVoidMethod(cls, mid, 100); jvm->DestroyJavaVM();
è¡ããšã«åæããŸãããïŒ
- JavaVM - JavaVMãäœæããã³ç Žæ£ã§ããé¢æ°ãåŒã³åºãããã®ã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããŸãã
- JNIEnv -JNIã®ã»ãšãã©ã®æ©èœãæäŸããŸãã
- JavaVMInitArgs -JavaVMã®åŒæ°ã
- JavaVMOption -JavaVMã®ãªãã·ã§ã³ã
JNI_CreateJavaVMïŒïŒã¡ãœããã¯ãJavaVMãåæåãããããžã®ãã€ã³ã¿ãŒãè¿ããŸãã JNI_DestroyJavaVMïŒïŒã¡ãœããã¯ãäœæãããJavaVMãã¢ã³ããŒãããŸãã
ã¹ããªãŒã
Linuxã®ãã¹ãŠã®ã¹ã¬ããã¯ã«ãŒãã«ã«ãã£ãŠå¶åŸ¡ãããŸãããJavaVMé¢æ°AttachCurrentThreadããã³AttachCurrentThreadAsDaemonã«æ¥ç¶ã§ããŸãã ã¹ããªãŒã ã¯æ¥ç¶ãããŠããŸããããJNIEnvã«ã¢ã¯ã»ã¹ã§ããŸããã éèŠãªã®ã¯ãGCãèµ·åããå Žåã§ããAndroidã¯JNIã«ãã£ãŠäœæãããã¹ã¬ãããäžæããªãããšã§ãã ãã ããã¹ã¬ãããå®äºããåã«ãDetachCurrentThreadã¡ãœãããåŒã³åºããŠJavaVMããåæããå¿ èŠããããŸãã
æåã®ã¹ããã
ãããžã§ã¯ãæ§é ã¯æ¬¡ã®ããã«ãªããŸãã
å³3ãããããããã«ããã¹ãŠã®ãã€ãã£ãã³ãŒãã¯jniãã©ã«ããŒã«ãããŸãã ãããžã§ã¯ãããã«ããããšããã€ãã£ãã©ã€ãã©ãªã眮ãããåããã»ããµã¢ãŒããã¯ãã£ã®libsãã©ã«ããŒã«4ã€ã®ãã©ã«ããŒãäœæãããŸãïŒãã©ã«ããŒã®æ°ã¯ãéžæããã¢ãŒããã¯ãã£ã®æ°ã«ãã£ãŠç°ãªããŸãïŒã
ãã€ãã£ããããžã§ã¯ããäœæããã«ã¯ãéåžžã®Androidãããžã§ã¯ããäœæãã次ã®æé ã«åŸãå¿ èŠããããŸãã
- ãããžã§ã¯ãã®ã«ãŒãã§ããã€ãã£ãã³ãŒãã®ãœãŒã¹ã³ãŒããé 眮ããjniãã©ã«ããŒãäœæããå¿ èŠããããŸãã
- ãããžã§ã¯ãããã«ãããAndroid.mkãã¡ã€ã«ãäœæããŸãã
- ã¢ã»ã³ããªã®è©³çŽ°ãèšè¿°ããApplication.mkãã¡ã€ã«ãäœæããŸãã åææ¡ä»¶ã§ã¯ãããŸããããã¢ã»ã³ããªãæè»ã«æ§æã§ããŸãã
- ãã«ãããã»ã¹ãéå§ããndk-buildãã¡ã€ã«ãäœæããŸãïŒãããå¿ é ã§ã¯ãããŸããïŒã
Android.mk
åè¿°ã®ããã«ãããã¯ãã€ãã£ããããžã§ã¯ãããã«ãããããã®ã¡ã€ã¯ãã¡ã€ã«ã§ãã Android.mkã䜿çšãããšãã³ãŒããã¢ãžã¥ãŒã«ã«ã°ã«ãŒãåã§ããŸãã ã¢ãžã¥ãŒã«ã¯ãéçã©ã€ãã©ãªïŒéçã©ã€ãã©ãªããããžã§ã¯ãã«ã®ã¿ã³ããŒãããlibsãã©ã«ããŒïŒãå ±æã©ã€ãã©ãªïŒå ±æã©ã€ãã©ãªïŒãã¹ã¿ã³ãã¢ãã³ã®å®è¡å¯èœãã¡ã€ã«ã®ããã«ããããšãã§ããŸãã
æå°æ§æäŸïŒ
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := NDKBegining LOCAL_SRC_FILES := ndkBegining.c include $(BUILD_SHARED_LIBRARY)
詳现ã«æ€èšããŠãã ããïŒ
- L OCAL_PATHïŒ= $ïŒcall my-dirïŒ-call my-diré¢æ°ã¯ããã¡ã€ã«ãåŒã³åºããããã©ã«ããŒã®ãã¹ãè¿ããŸãã
- include $ïŒCLEAR_VARSïŒ -LOCAL_PATHãé€ã以åã«äœ¿çšãããå€æ°ãã¯ãªã¢ããŸãã ã¢ã»ã³ããªã¯åäžã®GNU Makeã®ã³ã³ããã¹ãã§è¡ãããããããã¹ãŠã®å€æ°ãã°ããŒãã«ã§ããããããããå¿ èŠã§ãã
- LOCAL_MODULE-åºåã¢ãžã¥ãŒã«ã®ååã ãã®äŸã§ã¯ãåºåã©ã€ãã©ãªã®ååã¯NDKBeginingã«èšå®ãããŠããŸãããã¢ã»ã³ããªåŸãlibNDKBeginingãšããååã®ã©ã€ãã©ãªãlibsãã©ã«ããŒã«äœæãããŸãã Androidã¯ååã«libæ¥é èŸãè¿œå ããŸãããJavaã³ãŒãã§ã¯ãæ¥ç¶æã«æ¥é èŸãªãã§ã©ã€ãã©ãªã®ååãæå®ããå¿ èŠããããŸãïŒã€ãŸããååã¯makeãã¡ã€ã«ã«ã€ã³ã¹ããŒã«ãããååãšäžèŽããå¿ èŠããããŸãïŒã
- LOCAL_SRC_FILES-ã¢ã»ã³ããªãäœæãããœãŒã¹ãã¡ã€ã«ã®ãªã¹ãã
- include $ïŒBUILD_SHARED_LIBRARYïŒ -åºåã¢ãžã¥ãŒã«ã®ã¿ã€ãã瀺ããŸãã
Android.mkã§ç¬èªã®å€æ°ãå®çŸ©ã§ããŸããã次ã®æ§æã䜿çšããªãã§ãã ããïŒLOCAL_ãPRIVATE_ãNDK_ãAPP_ãmy-dirã MY_ãªã©ã®å€æ°ãåŒã³åºãããšããå§ãããŸãã äŸïŒ
MY_SOURCE := NDKBegining.c : $(MY_SOURCE) , , : LOCAL_SRC_FILES += $(MY_SOURCE)
Application.mk
ãã®ã¡ã€ã¯ãã¡ã€ã«ã«ã¯ãã¢ã»ã³ããªã®æè»æ§ãé«ããã®ã«åœ¹ç«ã€ããã€ãã®å€æ°ãèšèŒãããŠããŸãã
- APP_OPTIM-ãªãªãŒã¹ãŸãã¯ãããã°ã«èšå®ãããè¿œå å€æ°ã ã¢ãžã¥ãŒã«ã®ã¢ã»ã³ããªäžã®æé©åã«äœ¿çšãããŸãã ãªãªãŒã¹ãšãããã°ã®äž¡æ¹ããããã°ã§ããŸããããããã°ã¯ãããã°ã«é¢ãã詳现æ å ±ãæäŸããŸãã
- APP_BUILD_SCRIPT-Android.mkãžã®ä»£æ¿ãã¹ã瀺ããŸãã
- APP_ABIã¯ããããæãéèŠãªå€æ°ã®1ã€ã§ãã ã¢ãžã¥ãŒã«ãçµã¿ç«ãŠãããã»ããµã¢ãŒããã¯ãã£ã瀺ããŸãã ããã©ã«ãã¯ãARMv5TEã¢ãŒããã¯ãã£ã«å¯Ÿå¿ããarmeabiã§ãã ããšãã°ãARMv7ããµããŒãããã«ã¯ãarmeabi-v7aãIA-32-x86ãMIPS-mipsã䜿çšãããããã¹ãŠã®ã¢ãŒããã¯ãã£ããµããŒãããå¿ èŠãããå Žåãå€ã¯æ¬¡ã®ããã«ãªããŸãïŒAPP_ABIïŒ= armeabi armeabi-v7a x86 mips ndkããŒãžã§ã³7以éã䜿çšããå Žåããã¹ãŠã®ã¢ãŒããã¯ãã£ããªã¹ãããããšã¯ã§ããŸããããAPP_ABIïŒ= allã次ã®ããã«èšå®ããŸãã
- APP_PLATFORM-ãã©ãããã©ãŒã ã¿ãŒã²ããã
- APP_STL -Androidã¯ã©ã³ã¿ã€ã ã©ã€ãã©ãªlibstdc ++ã䜿çšãããããåãæšãŠãããéçºè ããã¹ãŠã®C ++æ©èœãå©çšã§ããããã§ã¯ãããŸããã ãã ããå€æ°APP_STLã䜿çšãããšãã¢ã»ã³ããªã«æ¡åŒµæ©èœã®ãµããŒããå«ããããšãã§ããŸãã
- NDK_TOOLCHAIN_VERSION -gccã³ã³ãã€ã©ããŒãžã§ã³ïŒããã©ã«ã4.6ïŒãéžæã§ããŸãã
NDK-BUILDS
Ndk-buildã¯GNU Makeã©ãããŒã§ãã 4çªç®ã®ããŒãžã§ã³ã®åŸãndk-buildã®ãã©ã°ãå°å ¥ãããŸããã
- clean-çæããããã¹ãŠã®ãã€ããªãã¡ã€ã«ãã¯ãªãŒãã³ã°ããŸãã
- NDK_DEBUG = 1-ãããã°ã³ãŒããçæããŸãã
- NDK_LOG = 1-ã¡ãã»ãŒãžãã°ã衚瀺ããŸãïŒãããã°ã«äœ¿çšïŒã
- NDK_HOST_32BIT = 1 -Androidã«ã¯ããŠãŒãã£ãªãã£ã®64ãããããŒãžã§ã³ããµããŒãããããŒã«ããããŸãïŒããšãã°ãNDK_PATH \ toolchains \ mipsel-linux-android-4.8 \ prebuilt \ windows-x86_64ãªã©ïŒã
- NDK_APPLICATION_MK-Application.mkãžã®ãã¹ãæå®ãããŠããŸãã
NDKã®5çªç®ã®ããŒãžã§ã³ã§ã¯ãNDK_DEBUGã®ãããªãã©ã°ãå°å ¥ãããŸããã 1ã«èšå®ãããŠããå Žåããããã°ããŒãžã§ã³ãäœæãããŸãã ãã©ã°ãèšå®ãããŠããªãå Žåãndk-buildã¯ããã©ã«ãã§androidïŒdebuggable = "true"å±æ§ãAndroidManifest.xmlã«ãããã©ããã確èªããŸãã ããŒãžã§ã³8ããäžã®ndkã䜿çšããå ŽåãAndroidManifest.xmlã§androidïŒdebuggableå±æ§ã䜿çšããããšã¯ãå§ãããŸããïŒAntãã©ã°ã€ã³ã䜿çšããããADTãã©ã°ã€ã³ã䜿çšããŠãããã°ããŒãžã§ã³ããã«ããããšããã©ã°NDK_DEBUG = 1ãèªåçã«è¿œå ãããŸãïŒ ã
ããã©ã«ãã§ã¯ã64ãããããŒãžã§ã³ã®ãŠãŒãã£ãªãã£ã®ãµããŒããã€ã³ã¹ããŒã«ãããŠããŸããããã©ã°NDK_HOST_32BIT = 1ãèšå®ããããšã§ã32ã®ã¿ã匷å¶ã§ããŸãã ãã ããGoogleã¯64ããããŠãŒãã£ãªãã£ã䜿çšããŠå€§èŠæš¡ãªããã°ã©ã ã®ããã©ãŒãã³ã¹ãåäžãããããšãæšå¥šããŠããŸãã
ãããžã§ã¯ããçµã¿ç«ãŠãæ¹æ³ã¯ïŒ
以åã¯èŠçã§ããã CDTãã©ã°ã€ã³ãã€ã³ã¹ããŒã«ããcygwinã³ã³ãã€ã©ãŸãã¯mingwãããŠã³ããŒãããå¿ èŠããããŸããã Android NDKãããŠã³ããŒãããŸãã ãã¹ãŠãEclipseèšå®ã§æ¥ç¶ããŸãã ãããŠããããã©ãã»ã©æªã§ãããåŽåè ã§ã¯ãªãããšãå€æããŸããã Android NDKã«åããŠåºäŒã£ããšãã3æ¥éãã¹ãŠèšå®ããŸããïŒãããŠãåé¡ã¯cygwinããããžã§ã¯ããã©ã«ããŒã§777ã®èš±å¯ãäžããå¿ èŠãããããšãå€æããïŒã
ããã§ããã¹ãŠãã¯ããã«ç°¡åã«ãªããŸããã ãã®ãªã³ã¯ã«åŸã£ãŠãã ãã ã ã¢ã»ã³ããªã«å¿ èŠãªãã®ããã¹ãŠå«ãŸããŠããEclipse ADTãã³ãã«ãããŠã³ããŒãããŸãã
Javaã³ãŒããããã€ãã£ãã¡ãœãããåŒã³åºã
Javaã®ãã€ãã£ãã³ãŒãã䜿çšããã«ã¯ãæåã«Javaã¯ã©ã¹ã§ãã€ãã£ãã¡ãœãããå®çŸ©ããå¿ èŠããããŸãã äŸïŒ
native String nativeGetStringFromFile(String path) throws IOException; native void nativeWriteByteArrayToFile(String path, byte[] b) throws IOException;
äºçŽèªãnativeãã¯ã¡ãœããã®åã«é 眮ããå¿ èŠããããŸãã ãã®ããã«ããŠãã³ã³ãã€ã©ã¯ãããJNIãžã®ãšã³ããªãã€ã³ãã§ããããšãèªèããŸãã ãããã®ã¡ãœãããC / C ++ãã¡ã€ã«ã«å®è£ ããå¿ èŠããããŸãã ãŸããnativeXãšããèªã§ã¡ãœããã«ååãä»ããããšããå§ãããŸããXã¯ã¡ãœããã®å®éã®ååã§ãã ãã ãããããã®ã¡ãœãããæåã§å®è£ ããåã«ãããããŒãã¡ã€ã«ãçæããå¿ èŠããããŸãã ããã¯æåã§è¡ãããšãã§ããŸãããjdkã«ããjavahãŠãŒãã£ãªãã£ã䜿çšã§ããŸãã ããããå ã«é²ãã§ãã³ã³ãœãŒã«ããã¯äœ¿çšããŸããããæšæºã®EclipseããŒã«ã䜿çšããŠãããè¡ããŸãã
ããã§å®è¡ã§ããŸãã bin / classesãã£ã¬ã¯ããªã«ã¯ããããŒãã¡ã€ã«ãå«ãŸããŸãã
次ã«ããããã®ãã¡ã€ã«ããã€ãã£ããããžã§ã¯ãã®jniãã£ã¬ã¯ããªã«ã³ããŒããŸãã ãããžã§ã¯ãã®ã³ã³ããã¹ãã¡ãã¥ãŒãåŒã³åºããŠãAndroid Tools-Add Native Libraryã®é ç®ãéžæããŸãã ããã«ãããjni.hé¢æ°ã䜿çšã§ããããã«ãªããŸãã ãã®åŸããã§ã«cppãã¡ã€ã«ãäœæãïŒããã©ã«ãã§Eclipseãäœæããå ŽåããããŸãïŒãããããŒãã¡ã€ã«ã«æ¢ã«èšè¿°ãããŠããã¡ãœããã®æ¬äœãäœæã§ããŸãã
èšäºãæ¡åŒµããªãããã«ãèšäºã«ãµã³ãã«ã³ãŒããè¿œå ããŸããã§ããã githubãã衚瀺/ããŠã³ããŒãã§ããäŸã