zoukankan      html  css  js  c++  java
  • android配置jni过程可能会遇到的问题

    ubuntu上Android NDK调试配置 

    ubuntu上Android NDK调试配置

    android上调试本地c/c++时,可以直接使用gdb在命令行中调试,很麻烦。这里通过sequoyah插件将调试功能集成到eclipse中,在图形界面中调试。下面的参考参考资料中已经说明的很详细了,自己搭建某些地方疏忽了,花了很长时间。

    参考了下面几篇文章

    http://blog.csdn.net/dfqin/article/details/6901506

    http://www.eclipse.org/sequoyah/documentation/native_debug.php

    http://www.cnblogs.com/shadox/archive/2011/12/02/2272564.html

    一、环境配置
    我安装的NDK版本为android-ndk-r7b-linux-x86.tar.bz2,此外还需要安装CDT和sequoyah,直接在eclipse中进行安装
    1.安装CDT


    2.安装sequoyah插件


    3.设置环境变量
    在/etc/profile中添加以下语句
    ANDROID_SDK_TOOLS=$HOME/android-sdk-linux/platform-tools
    NDK_HOME=$HOME/android-ndk-r7b/
    export PATH=$PATH:$NDK_HOME:$ANDROID_SDK_TOOLS
    保存退出后,执行source /etc/profile使用环境变量生效

    4.在eclipse中,Window->Preferences->Android中设置本地开发NDK位置

    二、建立测试工程
    1.现在新建一个Android工程Orange,修改java代码如下
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    package com.gavin.example;
     
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.os.Bundle;
     
     
    public class OrangeActivity extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            new AlertDialog.Builder(this).setMessage(sayHello()).show();
        }
         
        public native String sayHello();    //native函数 
         
        static {
            System.loadLibrary("Orange");
        }
         
    }

    代码中引用了一个Native函数,用于获取一个字符串

    2.在工程名上右键选择Android Tools->Add Native Support


    这个界面中,应该是也是可以设置NDK位置的,我的环境可能有些问题,NDK位置不能编译,所以必需在前一步骤中设置。

    现在工程目录中应该多了一个jni目录,目录中有两个文件Orange.cpp和Android.mk.

    3.在Orange.cpp中添加一个函数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #include <string.h>
    #include <jni.h>
    extern "C"
    {
        jstring Java_com_gavin_example_OrangeActivity_sayHello( JNIEnv* env,
    jobject thiz );
    }
     
     
    jstring Java_com_gavin_example_OrangeActivity_sayHello( JNIEnv* env,
                                                      jobject thiz )
    {
        return env->NewStringUTF("Hello, I'm an Orange!");
     
     
    }

    4.现在编译工程可能提示以下错误信息

    1
    2
    3
    4
    Method 'NewStringUTF' could not be resolved    com_permadi_testJNI_TestJNIActivity.c    /TestJNIC/jni    line 6    Semantic Error
    Type 'JNIEnv' could not be resolved    com_permadi_testJNI_TestJNIActivity.c    /TestJNIC/jni    line 4    Semantic Error
    Type 'jobject' could not be resolved    com_permadi_testJNI_TestJNIActivity.c    /TestJNIC/jni    line 4    Semantic Error
    Type 'jstring' could not be resolved    com_permadi_testJNI_TestJNIActivity.c    /TestJNIC/jni

    解决办法,Properties->c/c++ General/Paths and Symbols->includes
    GNU C 添加/home/gavin/android-ndk-r7b/platforms/android-14/arch-arm/usr/include
    GNU c++ 也一样
    参考http://permadi.com/blog/2011/09/creating-your-first-android-jnindk-project-in-eclipse-with-sequoyah

    编译Orange工程,启动模拟器测试一下应该能成功显示"Hello, I'm an Orange!"字符串了

    5.设置编译debug标志

    修改工程配置文件AndroidManifest.xml,将Debuggable标志设置为true,如下



    三、调试器的配置

    1.找到NDK目录下的ndk-gdb脚本,注释掉最后一句
    # $GDBCLIENT -x $GDBSETUP -e $APP_PROCESS
    现在在命令行中进入工程目录,执行ndk-gdb命令,将在obj/local/armeabi中生成了app_process,gdb.setup等新文件

    1
    2
    3
    gavin@gavin-desktop:~/workspace/Orange$ ndk-gdb
    gavin@gavin-desktop:~/workspace/Orange$ ls obj/local/armeabi/
    app_process  gdb.setup  libc.so  libOrange.so  libstdc++.a  objs  objs-debug
    将上面的gdb.setup文件改名为gdb2.setup,并删除掉最后一句
    target remote:5039

    选择工程->debug as->debug configurations,在c/c++ Application上右健新建一个配置
    2.Main选项卡


    c/c++ Application中填写由ndk-gdb命令生成的app_process文件,/home/gavin/workspace/Orange/obj/local/armeabi/app_process
    点击最下面的"Select other...",勾选"Use configuration specific setting", 在下面的框中选择"Standard Crete Process Launcher"




    3.Debugger选项卡
    Debugger中选择"gdbserver"
    GDB debugger: /home/gavin/android-ndk-r7b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gdb

    GDB command file: /home/gavin/workspace/Orange/obj/local/armeabi/gdb2.setup

    最好勾选一下最下面的"verbose console mode",这样在console中会输出gdb命令信息



    切换到Connection子选项卡
    协议类型选择"TCP",端口号填"5039"
    四、调试

    1.在java中调用native方法处添加断点,c++函数中也设置断点,启动java项目调试,这时程序应该在调用native方法处中断。

    2.现在命令行进入工程目录,执行ndk-gdb。刚开始的时候我忽略了这一步,结果出现下面的错误,纠结了两个小时

    1
    2
    3
    4
    Target selection failed.
    Remote communication error: Connection reset by peer.
    Remote communication error: Connection reset by peer.
    Remote communication error: Connection reset by peer.

    3.工程属性->debug as->debug configurations,在c/c++ Application中选中Orange Default配置,点击“Debug”

  • 相关阅读:
    Python 在线基础课程
    单链表实现两个集合的交并补
    矩阵奇异值分解SVD
    动态规划0-1背包问题
    Java数字反转
    简单SqL语句
    HTML和CSS
    while和for循环
    C#读取和写入配置文件
    C# 添加系统计划任务方案
  • 原文地址:https://www.cnblogs.com/songtzu/p/2957657.html
Copyright © 2011-2022 走看看