gdb調試Android-5.1版本JNI模塊

未完成!!!但是可以看

本文講述在gdb的模式下如何來調試Android虛擬機中的JNI的代碼模塊

       這裏我們先介紹JNI模式中的Java程序來調用C程序來實現Java函數中的函數功能,我們假設TestJNI爲Java文件中的主類,那就可能需要TestJNI.java、TestJNI.h、TestJNI.c、TestJNI.o、等文件。(所有的對系統的操作都是在/workspace/android/目錄下)

一、首先編寫帶有native本地方法的一個Java文件

class  TestJNI{
  static{
  System.loadLibrary("TestJNI");
  }
  public static native int add(int a, int b);
  public static void main(String[] args){
     int c = add(3,4);
     System.out.println("Test JNI");
     System.out.println("c="+c);
  }
}

     這個Java文件可以使用gedit文本編輯器進行生成,並且命名爲TestJNI.java

     接下來使用javac命令進行編譯java文件,生成TestJNI.class文件

     

     生成的.class文件將會在後面用來生成.dex文件,這個.dex文件最後就會推送到Android虛擬機的sdcard中。

二、使用javah命令來生成TestJNI.h文件

   

   生成的TestJNI.h文件是這樣的

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class TestJNI */

#ifndef _Included_TestJNI
#define _Included_TestJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     TestJNI
 * Method:    add
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_TestJNI_add
  (JNIEnv *, jclass, jint, jint);

#ifdef __cplusplus
}
#endif
#endif

   注意:此時生成的TestJNI.h文件中的頭文件引用部分可能是這樣的

   #include <jni.h>
    要將它改成這樣

   #include "jni.h"
    否則可能在後面進行gdb調試的時候,會報出找不到 jni.h頭文件的錯誤。

三、編寫TestJNI.c文件

    由於在TestJNI.c中我們將要實現TestJNI.h中的Java_TestJNI_add函數的功能,那麼先將上面生成

JNIEXPORT jint JNICALL Java_TestJNI_add
  (JNIEnv *, jclass, jint, jint);
    的黏貼到TestJNI.c中,並進行代碼功能實現。

#include "jni.h"
JNIEXPORT jint JNICALL Java_TestJNI_add
  (JNIEnv * env, jclass  class, jint a, jintb){
int c = a + b;
return c;
}
   編寫完TestJNI.c文件後我們將上面的所有文件和系統的jni.h文件放到一個文件夾下。這時由於我的Android虛擬機的程序工作目錄是在系統的/workspace/android/文件夾下。Android-5.1版本系統的jni.h是在android/libnativehelper/include/nativehelper中,所以現在先將jni.h移動到/workspace/android/目錄下面。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章