يدعم Android لغات C ++ (NDK) و Java (SDK). عند استخدام لغة C ++ ، من المهم بشكل خاص التفاعل مع رمز C ++ و Java. هناك مثال بسيط للعينات/Hello-Jni للإشارة إليه في حزمة NDK التي تم تنزيلها.
جافا مكالمات C ++
قم بإنشاء مشروع Android جديد وإنشاء الفئة التالية:
package com.example.testjni ؛ class public textJni {// support to c static {system.loadlibrary ("jniinterface") ؛ } static int int getint () ؛ السلسلة الأصلية الثابتة العامة getString () ؛}يعلن ما ورد أعلاه طريقتين أصليتين ، مما يشير إلى أن تنفيذ طريقة GetInt و GetTring ستعطى في C ++ (libjniinterface.so).
قم بتشغيل الأمر التالي في دليل الفئات لإنشاء ملف التنفيذ المقابل لـ Native.
javah com.example.testjni.textjni # لاحظ أنه إذا كنت تريد أن يكون لديك فئة Android SDK ، فأنت بحاجة إلى تحديد classpath ، مثل javah -classpath/users/richard/dev/android/sdk/platforms
قم بإنشاء ملف الرأس ونسخه ، وإنشاء مجلد 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 ؛ إرجاع x ؛} // طرق لتنفيذ com_example_textjni_textjni.h jniexport jint jnicall java_com_example_testjni_textjni_getint (jnienv * env ، jclass cls) {return sum () ؛} jniexport java_com_example_testjni_textjni_getstring (jnienv * env ، jclass cls) {return env-> newstringutf ("hellondk!") ؛}يتم استخدام الإلغاء المتبادل هنا ، ويحتاج Android.mk لتنظيم رمز C ++.
قم بإنشاء ملف Android.mk جديد ضمن JNI/
Android.mk:local_path: = $ (اتصل my-dir) $ (clear_vars) local_module: = jniinterfacelocal_src_files: = com_example_testjni_textjni.cpp#local_c_includes: = $ (local_path) تشمل $ (build_shared_liberary)
ثم يمكنك استخدام الأداة في NDK: NDK-Build لإنشاء مكتبة ارتباط ديناميكية: libjniinterface.so
يمكن استدعاء ملف المكتبة الذي تم إنشاؤه بواسطة ملف Java السابق.
C ++ استدعاء Java
يمكنك استخدام JNI للاتصال بـ Java في طريقة GetString في المثال أعلاه:
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/logic/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) ؛ // Clean Jnienv-> deletelocalref (textJni) ؛ Jnienv-> deletelocalref (insttextjni) ؛ Std :: String stref = "Hellondk!" + view-> getStaticString () ؛ إرجاع 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 إلى Char *
const char nativestring = (env)-> getTringUtfchars (env ، javastring ، 0) ؛
إرجاع مؤشر إلى صفيف أحرف UTF-8 من السلسلة التي ستبقى صالحة حتى يتم إصدارها بواسطة RELEASTRINGUTFCHARS ().
(*env)-> releasestringutfchars (env ، javastring ، nativestring) ؛
شار * إلى JSTRING
JSTRING JSTR = (ENV)-> NEWSTRINGUTF (ENV ، Char UTF)
استخدم صفيف أحرف UTF-8 لبناء كائن جديد java.lang.string.
أنواع أخرى حدد كل النسخ في ملاحظات جافا نوع جافا محلي نوع c
منطقية jBoolean غير موقعة ، 8 بتات
بايت jbyte غير موقعة ، 8 بتات
char jchar غير موقعة ، 16 بت
وقعت JShort قصيرة ، 16 بت
وقعت int Jint ، 32 بت
وقعت Jlong Long ، 64 بت
تعويم Jfloat 32 بت
مزدوج Jdouble 64 بت
void void n/a