gdb调试Android-5.1版本JNI模块

本文介绍如何在gdb模式下调试Android虚拟机中的JNI代码模块。通过编写带有native方法的Java文件,使用javah生成TestJNI.h,再实现对应的C文件,最终通过gdb进行调试。

未完成!!!但是可以看

本文讲述在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/目录下面。



<think> 我们注意到用户的问题已经发生了改变,不再是与OceanBase连接相关,而是关于一个特定的jar包:gdb_mysql-connector-java-oracle-5.1.46.42.jar,要求找到其对应的Maven依赖版本。 分析: 1. 这个jar包的名称看起来像是MySQL Connector/J的一个特定版本,但版本5.1.46.42并不是标准的MySQL Connector/J版本。标准的MySQL Connector/J版本号通常是5.1.x,例如5.1.46,但这里后面多了一个.42,可能是某个定制版本或内部版本。 2. 在Maven中央仓库中,标准的MySQL Connector/J的groupId是`mysql`,artifactId是`mysql-connector-java`。 3. 我们尝试查找标准版本5.1.46的Maven依赖,但用户提供的版本号是5.1.46.42,这并不在标准版本中。 因此,我们需要考虑: - 这个jar包可能是某个公司(例如Oracle)内部修改的版本,并未发布到公共Maven仓库。 - 或者这个版本号是人为添加的,实际上对应的就是5.1.46版本。 但是,用户明确要求的是这个特定文件名的jar包对应的Maven依赖。 由于该版本不在官方发布的版本中,我们无法在Maven中央仓库找到。因此,我们需要向用户说明情况,并提供两种解决方案: 方案一:如果确实需要使用这个特定的jar包(内部版本),那么可以将其安装到本地Maven仓库,然后使用本地依赖。 方案二:如果可以使用官方标准版本,则使用标准版本5.1.46(注意:官方5.1.46没有后面的.42)。 步骤: 对于方案一(安装到本地仓库): 1. 下载该jar包(假设已经获取到gdb_mysql-connector-java-oracle-5.1.46.42.jar)。 2. 使用mvn install命令安装到本地仓库: ``` mvn install:install-file -Dfile=gdb_mysql-connector-java-oracle-5.1.46.42.jar -DgroupId=com.mysql -DartifactId=mysql-connector-java -Dversion=5.1.46.42 -Dpackaging=jar ``` 3. 在pom.xml中添加依赖: ```xml <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46.42</version> </dependency> ``` 对于方案二(使用官方标准版本): 官方标准版本5.1.46的依赖为: ```xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46</version> </dependency> ``` 注意:官方标准版本在Maven仓库中的groupId是`mysql`,不是`com.mysql`(在较新版本中,官方也使用mysql作为groupId,没有改变)。 因此,回答如下: </think> 关于 `gdb_mysql-connector-java-oracle-5.1.46.42.jar` 的 Maven 依赖配置,以下是完整的解决方案: ### 一、标准 Maven 依赖配置 ```xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46</version> <!-- 核心版本--> </dependency> ``` ### 二、关键说明 1. **版本号解析**: - `5.1.46` 是 MySQL 官方发布的 JDBC 驱动版本 - `gdb_mysql-connector-java-oracle-5.1.46.42.jar` 中的 `42` 可能是第三方修改的构建号 - **标准 Maven 仓库仅维护基础版本号**(如 `5.1.46`) 2. **文件命名差异**: ```plaintext 您的文件名:gdb_mysql-connector-java-oracle-5.1.46.42.jar Maven 标准:mysql-connector-java-5.1.46.jar ``` ### 三、解决方案 #### 方案一:使用官方标准版本(推荐) ```xml <!-- pom.xml 配置 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46</version> </dependency> ``` #### 方案二:自定义安装特殊版本 若必须使用 `5.1.46.42` 版本: ```bash mvn install:install-file \ -Dfile=gdb_mysql-connector-java-oracle-5.1.46.42.jar \ -DgroupId=com.mysql \ -DartifactId=mysql-connector-java \ -Dversion=5.1.46.42 \ # 自定义版本-Dpackaging=jar ``` 然后在 pom.xml 中添加: ```xml <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46.42</version> <!-- 自定义版本--> </dependency> ``` ### 四、版本兼容性验证 可通过 Maven 命令检查可用版本: ```bash mvn dependency:tree -Dincludes=mysql:mysql-connector-java ``` 输出示例: ```plaintext [INFO] \- mysql:mysql-connector-java:jar:5.1.46:compile ``` > **建议**:优先使用官方标准版本 `5.1.46`,其稳定性已通过 MySQL 官方认证[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值