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文件
这个Java文件可以使用gedit文本编辑器进行生成,并且命名为TestJNI.java
接下来使用javac命令进行编译java文件,生成TestJNI.class文件
![](http://img.blog.csdn.net/20150826212228559?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
生成的.class文件将会在后面用来生成.dex文件,这个.dex文件最后就会推送到Android虚拟机的sdcard中。
二、使用javah命令来生成TestJNI.h文件
![](http://img.blog.csdn.net/20150826213003967?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
生成的TestJNI.h文件是这样的
注意:此时生成的TestJNI.h文件中的头文件引用部分可能是这样的
三、编写TestJNI.c文件
由于在TestJNI.c中我们将要实现TestJNI.h中的Java_TestJNI_add函数的功能,那么先将上面生成
本文讲述在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/目录下面。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android使用Jni实现压力锅数据检测效果示例
- JAVA中JNI的简单使用分享
- c++ mk文件出错Jni调用产生java.lang.UnsatisfiedLinkError错误解决方法
- 安卓应用开发通过java调用c++ jni的图文使用方法
- Java调用c++库
- Android App 增量更新实例(Smart App Updates)
- 每周总结20130814——Android NDK环境的搭建和使用,YUV420SP格式图像的处理
- Android NDK开发简介
- Android NDK开发之Jni的数据类型
- Android NDK开发之数组类型的操作
- Android NDK开发之Jni调用Java对象
- JNI中参数的传递与操作
- JNI Java 向C传送字符串尝试-附代码
- android JNI 调用
- [android底层]JNI字段描述符
- Android Studio 用 JNI 实现与原生代码通信
- [Android]关于Native函数的debug