java jni调试_jni4-Android 学习笔记--利用JNI技术在Android中调用、调试C++代码

本文详细介绍了在Android中使用JNI技术调用和调试C++代码的步骤,包括下载ADT和NDK、配置NDK路径、创建Android项目、编写Java和C++代码、配置生成的.so文件目标平台、调试C++代码等。通过实例展示了如何解决编译错误、动态链接库文件的生成以及在Eclipse中配置调试环境。
摘要由CSDN通过智能技术生成

在Android中调用C++其实就是在Java中调用C++代码,只是在windows下编译生成DLL,在Android中会生成Linux系统下的.so文件(好吧,其实我基本没用过Linux)。

没写过JNI的可以看看我之前的博客(Windows下利用Visual Studio开发的过程):http://cherishlc.iteye.com/admin/blogs/1328136

以及自动生成工具swig的使用方法(数组的支持不好!其他挺方便):http://cherishlc.iteye.com/admin/blogs/1689224

另外推荐一篇非常不错的NDK博文,(配置忽略,主要是各种数据的传递,下代码看看吧)http://vaero.blog.51cto.com/4350852/782787

扯远了,下面来看看真正在Android中的开发过程。

1、下载ADT及NDK

其中ADT中包含了Eclipse及google的开发套件,不用写C++的下载ADT就足够了。

NDK则是包含了GCC的编译器,以及各个平台(arm,X86,MIPS)的相关头文件,交叉编译的一些平台相关文件等。

2、在ADT中配置NDK路径

解压NDK压缩包到任意路径,按下图在ADT中(也即ADT解压后的Eclipse文件下的Eclipse中)设置NDK的路径。

设置方法如下图所示:

a4c26d1e5885305701be709a3d33442f.png

3、创建含有本地代码的Android

Project该过程分为以下两步:

创建普通的Android Application工程(注意最小支持的API版本要不小于14)

加入本地代码支持

具体过程如下图所示:

创建工程:

a4c26d1e5885305701be709a3d33442f.png

加入本地代码支持:

a4c26d1e5885305701be709a3d33442f.png

完成情况:

a4c26d1e5885305701be709a3d33442f.png

点击菜单栏Project->Build All命令进行编译。

注意:如果之前最小支持的API版本要不小于14,将出现编译错误。“Android

NDK: WARNING: APP_PLATFORM android-14 is larger than

android:minSdkVersion 7 in ./AndroidManifest.xml”

解决方法如下:

打开AndroidManifest.xml,切换到源文件视图,将minSdkVersion 改为14以上:

a4c26d1e5885305701be709a3d33442f.png

4、编写Java端代码和C++端代码

Java端,注意不要继承自Android中的类,否则javah编译头文件时要指定android类路径。

packagecom.lc.testndk2;

importandroid.util.Log;

publicclassNativeClass {

//数组a中的每个元素都加上b,返回值为在C++中数据是否为a中数据拷贝得到的(按值拷贝还是传递指针)

publicstaticnativebooleanjniArrayAdd(int[] a,intb);

// 在C++中创建Java中的int数组,其中元素为 数组a中的对应元素乘以b

publicstaticnativeint[] jnitArrayMul(int[] a,intb);

static{

Log.i("NativeClass","before load library");

System.loadLibrary("TestNDK2");//注意这里为自己指定的.so文件,无lib前缀,亦无后缀

Log.i("NativeClass","after load library");

}

}

javah推荐两种方法:

在Eclipse中配置javah外部工具方法为:

a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png

上图中最长的一行命令如下:

Cmdineclipse代码

-v -classpath"${project_loc}/bin/classes"-d"${project_loc}/jni"${java_type_name}

--------------------------------------------

${system_path:javah}

${project_loc}

-v -classpath "${project_loc}/bin/classes" -d

"${project_loc}/jni" ${java_type_name}

选build all

[ Search Path: C:\Program

Files\Java\jdk1.6.0_45\jre\lib\resources.jar;C:\Program

Files\Java\jdk1.6.0_45\jre\lib\rt.jar;C:\Program

Files\Java\jdk1.6.0_45\jre\lib\sunrsasign.jar;C:\Program

Files\Java\jdk1.6.0_45\jre\lib\jsse.jar;C:\Program

Files\Java\jdk1.6.0_45\jre\lib\jce.jar;C:\Program

Files\Java\jdk1.6.0_45\jre\lib\charsets.jar;C:\Program

Files\Java\jdk1.6.0_45\jre\lib\modules\jdk.boot.jar;C:\Program

Files\Java\jdk1.6.0_45\jre\classes\C:\Users\1\workspace\TestNDK2/bin/classes

]

[Creating file

C:\Users\1\workspace\TestNDK2/jni\com_lc_testndk2_NativeClass.h]

[源文件的搜索路径: C:\Users\1\workspace\TestNDK2\bin\classes]

[类文件的搜索路径: C:\Program

Files\Java\jdk1.6.0_45\jre\lib\resources.jar,C:\Program

Files\Java\jdk1.6.0_45\jre\lib\rt.jar,C:\Program

Files\Java\jdk1.6.0_45\jre\lib\sunrsasign.jar,C:\Program

Files\Java\jdk1.6.0_45\jre\lib\jsse.jar,C:\Program

Files\Java\jdk1.6.0_45\jre\lib\jce.jar,C:\Program

Files\Java\jdk1.6.0_45\jre\lib\charsets.jar,C:\Program

Files\Java\jdk1.6.0_45\jre\lib\modules\jdk.boot.jar,C:\Program

Files\Java\jdk1.6.0_45\jre\classes,C:\Program

Files\Java\jdk1.6.0_45\jre\lib\ext\dnsns.jar,C:\Program

Files\Java\jdk1.6.0_45\jre\lib\ext\localedata.jar,C:\Program

Files\Java\jdk1.6.0_45\jre\lib\ext\sunjce_provider.jar,C:\Program

Files\Java\jdk1.6.0_45\jre\lib\ext\sunmscapi.jar,C:\Program

Files\Java\jdk1.6.0_45\jre\lib\ext\sunpkcs11.jar,C:\Users\1\workspace\TestNDK2\bin\classes]

[正在装入

C:\Users\1\workspace\TestNDK2\bin\classes\com\lc\testndk2\NativeClass.class]

[正在装入 java\lang\Object.class(java\lang:Object.class)]

[正在装入 java\lang\Throwable.class(java\lang:Throwable.class)]

[正在装入 java\lang\Class.class(java\lang:Class.class)]

[在718 毫秒内完成]

--------------------------------------------

配置好之后:

a4c26d1e5885305701be709a3d33442f.png

点刚才配置好的javah工具,生成.h文件,然后:

a4c26d1e5885305701be709a3d33442f.png

Java端调用JNI方法的代码:

将MainActivity改为:

packagecom.lc.testndk2;

importjava.util.Arrays;

importandroid.app.Activity;

importandroid.os.Bundle;

importandroid.widget.TextView;

publicclassMainActivityextendsActivity {

@Override

protectedvoidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

TextView tv =newTextView(this);

int[] array =newint[] {1,2,3};

String str ="数组,调用C++前"+ Arrays.toString(array);

booleanisCopyOfArrayInCpp = NativeClass.jniArrayAdd(array,1);

str +="\n在C+&

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值