Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 中級開發 >> Android JNI實例代碼(一)

Android JNI實例代碼(一)

編輯:中級開發

前幾天Android123有關android JNI開發系列教程中有關的源代碼,可以在本文中查找:

一、 在JNI中執行Java方法

class androidJniDemo {
 private native void executeMethod();
 private void show() {
  System.out.println("Java cwj print"); //執行了show方法後打印Java層的輸出
 }
 public static void main(String args[]) {  //這裡我們在J2SE中測試,android開發者可以放到Activity中的onCreate調用
  AndroidJniDemo ajd = new androidJniDemo();
  ajd.executeMethod(); 
 }
 static {
  System.loadLibrary("androidJniDemo");
 }
}

下面是JNI代碼:

JNIEXPORT void JNICALL
Java_androidJniDemo_executeMethod(JNIEnv *env, jobject obj)
{
 jclass clazz = (*env)->GetObjectClass(env, obj); //通過類的對象
 jmethodID mid = (*env)->GetMethodID(env, clazz, "show", "()V"); //查找Java中的show方法的ID,最後的簽名符號為void類型
 if (mid == NULL) {
  return;   //如果方法ID沒有找到
 }

 printf("JNI cwj print"); //從JNI中打印輸出

 (*env)->CallVoidMethod(env, obj, mid); //執行show方法
}

二、獲取/設置類的域或者說屬性字段

 (1 String類型的屬性讀寫

class androidJniDemo2 {
 private String sTmp;
 private native void readwriteFIEld();
 public static void main(String args[]) {
  AndroidJniDemo2 ajd2 = new androidJniDemo2();
  ajd2.sTmp = "cwj";
  ajd2.readwriteFIEld();
  System.out.println("Java cwj print ="+ajd2.sTmp);  //Java層打印結果
 
 }
 static {
  System.loadLibrary("androidJniDemo2");
 }
}

下面是JNI層代碼:
 
JNIEXPORT void JNICALL
Java_androidJniDemo2_readwriteField(JNIEnv *env, jobject obj)
{
 jfIEldID fid;
 jstring JStr;
 const char *szTemp;
 
 jclass clazz = (*env)->GetObjectClass(env, obj); 
  
 fid = (*env)->GetFIEldID(env, clazz, "sTmp", "Ljava/lang/String;"); // 注意sTmp是Java中聲明的,String類型在Java.lang.String包中,簽名符號的格式注意
 if (fid == NULL) {
  return;
 }
 
 JStr = (*env)->GetObjectFIEld(env, obj, fid);  //Java的String類型,要用GetObjectFIEld函數獲取,這裡android123提示大家沒有GetStringFIEld這樣的函數在JNI中,或者說在C語言中
 szTemp = (*env)->GetStringUTFChars(env, JStr, NULL); //因為還需要賦值,在C中我們轉換為utf8的類型。
 if (szTemp == NULL) {
  return;
 }

 printf("JNI cwj print=%s", szTemp); //先打印Java層傳進來的值

 (*env)->ReleaseStringUTFChars(env, JStr, szTemp); //szTemp打印完不用了要及時釋放掉
 
 JStr = (*env)->NewStringUTF(env, "android123"); //返新的字段值,供Java層打印
 if (JStr == NULL) {
  return; 
 }
 (*env)->SetObjectFIEld(env, obj, fid, JStr); //設置新的屬性值。
}

  (2 int或double類似的類型的屬性讀寫,本例同時屬性值是一個靜態的定義,注意下面加粗的static關鍵字

class androidJniDemo3 {
 private static int sAge;
 private native void readwriteFIEld();
 public static void main(String args[]) {
  AndroidJniDemo3 ajd3 = new androidJniDemo3();
  androidJniDemo3.sAge = 23;
  ajd3.readwriteFIEld(); //執行jni層
  System.out.println("Java cwj print="+sAge); //Java層打印新的值,應該為120
 }
 static {
  System.loadLibrary("androidJniDemo3");
 }
}

JNIEXPORT void JNICALL
Java_androidJniDemo3_readwriteField(JNIEnv *env, jobject obj)
{
 jfIEldID fid;
 jint nTemp;

 jclass clazz = (*env)->GetObjectClass(env, obj);

 fid = (*env)->GetStaticFIEldID(env, clazz, "sAge", "I"); //因為是整形,這裡簽名符號為I,注意使用的函數中包含Static代表是一個靜態的屬性
 if (fid == NULL) {
  return;
 }

 nTemp = (*env)->GetStaticIntFIEld(env, clazz, fid);
 printf("JNI cwj print=%d", nTemp); //這裡應該顯示23
 (*env)->SetStaticIntFIEld(env, clazz, fid, 120); //設置新的值為120,注意包含了Static,Java層中定義的sAge是靜態的。
}

 今天android開發網給出了較完整的JNI下執行Java的源代碼第一部分,有關第二部分可以查看 android JNI實例代碼(二)

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved