`
lzqustc
  • 浏览: 211045 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

Android之JNI续

阅读更多

Android NDK, Revision 8d (December 2012)

前一篇,简单介绍了使用NDK进行JNI的编程实践,当时使用的NDK版本是1.6_r1(2009),是很早的版本了,相应的toolset也就只包含了少数简单的命令。

JNI编程,必然涉及到C编程,那么当ApplicationC函数中遇到了错误,甚至crash(如Segmentation fault’Process xxx terminated by signal (11)’)时,就需要调试。可是在logcat中的信息就跟天书一样,只能找到一些寄存器以及函数地址。那要如何进行调试呢?

NDK r5b开始,增加了调试的支持,引入了ndk-gdb(可以单步调试程序)ndk-stack(可以查看堆栈信息)脚本。那么下面我们就来说说如何使用 Android NDK, Revision 8d

一、下载Android NDK, Revision 8d,解压即可。(E:\android-ndk-r8d)

二、Cygwin配置

         ultraEdit打开Cygwin/home/user/.bash_profile,在文件最后加入如下内容:

                   export ndk8=/cygwin/e/ android-ndk-r8d

         Cygwin终端输入如下命令:

                   source  /home/user/.bash_profile

         或者重启Cygwin终端。

         如果cd $ndk8能进入/cygwin/e/ android-ndk-r8d,那么配置成功。

三、编译.so

         Cygwin终端进入Andorid工程根目录如../MyJni/project/后,直接输入:ndk-build

         就可以编译安装.so文件最后会在project/下新增两个文件夹:

                   libs/armeabi/

                   obj/

以上过程基本和使用NDK1.6_r1一样。下面主要介绍ndk-adb使用方法。

1、  重新编译,并且加入NDK_DEBUG=1选项,即:ndk-build NDK_DEBUG=1

2、  运行ndk-adb

3、  设置断点,

(gdb) b 10

Breakpoint 1 at 0x80901244: file jni/MyJni.c, line 10.

(gdb) c

Continuing.

Program received signal SIGSEGV, Segmentation fault.

0xafd1cb6a in strcat () from E:\eclipse\MyJni\project/./obj/local/armeabi/libc.so

 

很明显上面的程序出现了Segmentation fault。具体错在0xafd1cb6a in strcat ()函数。

 

而在logcat中你只能看到如下信息:

01-21 08:36:12.487: I/DEBUG(30): *** *** *** *** *** *** *** *** *** *** *** *** *** ***

01-21 08:36:12.487: I/DEBUG(30): Build fingerprint: 'generic/google_sdk/generic/:2.2/FRF91/43546:eng/test-keys'

01-21 08:36:12.487: I/DEBUG(30): pid: 308, tid: 308  >>> com.jni.testjni <<<

01-21 08:36:12.495: I/DEBUG(30): signal 11 (SIGSEGV), fault addr 00000000

01-21 08:36:12.495: I/DEBUG(30):  r0 beebf43c  r1 00000000  r2 beebf480  r3 00000000

01-21 08:36:12.495: I/DEBUG(30):  r4 afd489b0  r5 00000000  r6 00000000  r7 beebf430

01-21 08:36:12.565: I/DEBUG(30):          #00  pc 0001cb6a  /system/lib/libc.so

01-21 08:36:12.565: I/DEBUG(30):          #01  lr 8090158b  /data/data/com.jni.testjni/lib/libHelloJni.so

……….

logcat对比,显然gdb的内容对开发人员更有帮助。

分享到:
评论

相关推荐

    Android应用源码45套安卓源码合集.zip

    Android应用源码串口通信(JNI)例子.rar Android应用源码任务提醒源码.rar Android应用源码仿360手机助手首页浮动菜单.rar Android应用源码仿Iphone抖动效果Shake Icon.rar Android应用源码仿QQ分组列表修改版.rar ...

    Android Studio配合Gradle及Unity交互笔记续

    在成功导出项目后,需要将 Unity 的 assets 目录和 jniLibs 目录拷贝到 Android Studio 项目的 main 目录下,并将 class 文件拷贝到 app/libs 目录。这部分操作主要涉及文件的移动和结构的调整,以满足 Android ...

    Android-Aria.zip

    然而,对于性能敏感的部分,如游戏引擎或图形处理,Android则使用C和C++,通过JNI(Java Native Interface)与Java代码交互,实现了高性能的需求。 在"Android-Aria.zip"这个压缩包中,我们可以看到一个名为"Aria-...

    Android视频压缩并且上传

    在Android上,可以通过jni或者第三方库如`ffmpeg-android-java`来集成和调用FFmpeg命令。 - **裁剪视频**:可以设置裁剪范围,只保留需要的部分。 - **调整分辨率**:降低分辨率可以显著减少视频大小。 - **改变...

    Android下的图片压缩及图片和视频的上传

    FFmpeg则是一个强大的跨平台多媒体处理库,可以通过JNI接口在Android上使用。 2. 视频帧率与比特率: 压缩视频时,关键在于调整帧率和比特率。降低帧率可以减少视频的大小,但可能会导致动作不连贯;比特率决定了...

    Android增量升级完整代码

    这个模块应能够处理断点续传,确保即使在下载过程中中断,也可以从上次中断的地方继续。 4. **本地合成**:下载完成后,客户端应用使用JNI(Java Native Interface)调用本地库进行文件的合并操作。JNI允许Java代码...

    Android摄像头RTMP推流

    在Android项目中集成FFmpeg,可以通过JNI(Java Native Interface)调用C/C++代码来实现。 1. **FFmpeg集成**:首先,需要将FFmpeg编译为适用于Android的库。这通常涉及到交叉编译,因为Android使用的是ARM架构,而...

    基于Android平台的信息采集与远程显示系统研究.pdf

    【基于Android平台的信息采集与远程显示系统研究】 摘要: 本文主要探讨了如何利用Android平台构建一个信息采集与远程显示系统,特别关注于农业领域的温室环境监控。系统通过JNI接口调用,读取外置温度传感器的数据...

    Android开发工程师_1年工作经验Android软件工程师求职简历个人简历.pdf

    6. **多线程断点下载**:在Android中,多线程下载能提高效率,断点续传则确保下载的连续性。 7. **ListView优化**:包括图片缓存和减少视图复用时的抖动,以提升列表滚动性能。 8. **事件分发机制**:理解View和 ...

    curl 全平台静态库,包括 android,ios ,win,mac,linux

    - 在Android上,使用静态库需要NDK,通过JNI接口将C/C++代码与Java代码交互。 - iOS开发中,静态库可以方便地添加到Xcode项目,避免了动态库的某些限制,比如App Store的审核问题。 - Windows、Mac和Linux的静态...

    安卓下利用ndk编译wget项目

    在Android环境下,使用wget可以帮助我们实现后台下载,尤其适用于大文件和需要断点续传的场景。 要将wget移植到Android,我们需要做以下几步: 1. **获取源代码**:首先,你需要从wget的官方网站或其他可靠的源...

    安卓Android源码——RockPlayer源码.zip

    首先,我们需要了解项目中的各个目录及其作用,例如"src"目录通常包含了所有源代码,"jni"目录用于存放C/C++原生代码,"res"目录存储资源文件,如布局文件和图片,"AndroidManifest.xml"定义了应用的基本信息和权限...

    一种基于原生系统的下载demo支持断点续传支持多线程下载.rar

    3. 原生系统:这里的“原生系统”可能指的是操作系统自身的编程环境,如Android的JNI(Java Native Interface)或iOS的Objective-C/Swift原生开发。在这种环境下,开发者可以直接操作底层系统资源,从而更高效地实现...

    安卓Android源码——安卓视音频播放测试工程.zip

    在安卓项目中,通过JNI(Java Native Interface)将FFmpeg库集成,可以实现对不常见或复杂格式的支持。 6. **多媒体文件解析**:源码中可能包含了对媒体文件元数据的解析,比如视频分辨率、编码格式、音频采样率等...

    浅谈Android Studio3.6 更新功能

    Native 工具现在支持 Android Studio 中的 Native(C/C++)开发扩展的 Kotlin 支持,包括改进的错误检查和 Kotlin JNI 声明与其 C/C++ 实现之间的导航。 Memory Profiler Memory Profiler 泄露检测现在,在 Memory...

    ffmpegDemo-V1

    在Android中,FFmpeg通过JNI(Java Native Interface)与Java代码交互,解析视频流并解码为像素数据。优化可能包括选择合适的解码器、减少内存拷贝、利用多线程等。解码后的视频帧通常会被传递到Surface上,通过...

    基于ffmpeg的视频压缩Demo

    对于预编译库,可以从网上找到适用于不同Android架构的版本,并将它们打包到项目的jniLibs目录下。如果选择构建源码,可以使用NDK(Native Development Kit)来编译FFmpeg,确保它支持目标设备的架构。 接下来,...

    集成二维码扫描及多线程下载

    在Android项目中,可能需要通过JNI(Java Native Interface)将Zbar的C++代码与Java代码结合,以实现二维码的扫描功能。 二、多线程下载器 在Android应用中,为了提高文件下载的效率和用户体验,通常会采用多线程...

    Peergine编程手册.pdf

    《Peergine编程手册》是针对Peergine这一对等通信中间件的详细指南,它以C/C++语言开发,适用于多种操作系统,如Windows、Linux和Android。Peergine通过ActiveX控件(pgATX)、NPAPI插件和JNI插件等形式在不同环境下...

    基于mongoose和openssl的安卓网络音乐下载器

    1. 引入库:在安卓项目中,需要将mongoose库编译为适用于安卓的.so文件,并将其添加到项目的jniLibs目录下。 2. 初始化服务器:在应用程序启动时,创建mongoose实例,设置监听端口和回调函数,用于处理HTTP请求。 3....

Global site tag (gtag.js) - Google Analytics