您的位置:首页 > 移动开发 > Android开发

gdb调试Android-5.1版本JNI模块

2015-08-26 20:55 387 查看
未完成!!!但是可以看
本文讲述在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/目录下面。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  JNI JavaNative