15235313_z0yP

Android JNI开发进阶

JNI调试技巧

写日志

  • 适用场合
    • 多线程环境,单步调试无法工作
    • 循环,查看中间结果
    • 关键点,影响运行结果的地方
  • 调用方式
    #include <android/log.h>
    #define LOG_TAG "System.out”
    
    #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
    #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
    
    LOGI("info\n");
    LOGD("debug\n");
    LOGD(“The string is %s”, p_str);
    

Eclipse IDE调试

  • 适用场合
    • 开发阶段
  • Eclipse IDE的配置
    • Android NDK下载,解压
    • 选择安装NDK Pluginsjni1
    • 设置Eclipse路径jni2
    • Add Native Support…jni3
    • 调试设置,新建Android Native Applicationjni4jni5
    • 选择工程jni6
    • 点击Debug开始调试
    • 打断点,单步调试jni7

Eclipse IDE调试注意事项

  • 修改工程设置的C/C++ Build的Build Command为
    ndk-build NDK_DEBUG = 1
  • 不是每一部手机都能支持Native Debug,三星的手机及Android 4.3手机不支持,检测方法:
    • $ adb shell
      $ cat /data/system/packages.list
    • 如果显示出内容,则表示支持Native Debug
    • 如果提示文件不存在(三星手机),或没有权限(Android 4.3),则不支持Native Debug

crash日志

jni8

  • 在命令行运行
$ cd <project_path>

$ arm-linux-androideabi-addr2line -C -f -e obj/local/armeabi/liblame.so 00030a8e
  • 输出
Java_com_wondershare_wav2mp3_LibLAME_nativeEncode

/Volumes/work/workspace/wav2mp3/jni/lamejni.c:54

CPU类型总览

CPU类型 子类型 CPU芯片 设备
ARM armv5te Samsung S3C46Q0X01-EE8X MTK早期智能机
armv6 BCM2835 (Raspberry Pi), BCM21553Qualcomm MSM720x, MSM7x27 HTC DreamHuawei U8650

iPhone 3G

LG Optimus S

armv7a vfpv3 Tegra 2 series(Dual Core) Acer Iconia Tab A100Samsung Galaxy Tab 10.1
armv7a NEON RK2918Samsung Exynos 3110 大部分主流手机
MIPS RealTek 机顶盒
X86 Intel Intel手机

编译不同CPU平台

# Application.mk

APP_ABI := armeabi armeabi-v7a x86 mips
# APP_ABI := all

APP_OPTIM := release
APP_CFLAGS := -O3 –mlong-calls –fprefetch-loop-arrays –ffast-math
# NEON
APP_CFLAGS += -mfpu=neon –mtune=cortex-a8
  • 不同的CPU对应不同的APP_ABI
  • APP_OPTIM针对release进行优化
  • APP_CFLAGS设置编译器的参数
  • 编译器优化的空间有限,一般最有效的优化方式是直接使用对应平台的汇编语言,如NEON指令集,能针对多媒体编解码进行优化

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

This site uses Akismet to reduce spam. Learn how your comment data is processed.