zoukankan      html  css  js  c++  java
  • android studio C/C++ jni 编写以及调试方法

    原文路径:

        http://blog.sina.com.cn/s/blog_ad64b8200102vnxl.html

    目录

    开发环境 2

    编写hello_jni程序 2

    运行结果 10

    调试程序 10

    开发环境

    IDE: android studio 1.1.0

    android NDK :R10

    android SDK : android -19

    编写hello_jni程序

    建立一个空的activity项目目录如图:

    image

    进入下图标红的文件 MainActivity文件中

    image

    添加如下代码在MainActivity类内

       static {

            System.loadLibrary("hello_jni");

        }

        public native  String getstringfromC();

    打开终端android studio已经提供了终端如图:

    image

    首先进入java目录执行命令:

    javah -d ../jni  com.example.root.ndk_sample.MainActivity

    com.example.root.ndk_sample.MainActivity是native函数的所在的包名和类名,中间使用“.”号分开。

    这时候就会在java目录下面出现jni目录如图:

    image

    添加*.c文件在jni目录中如图:(文件名字为hello_jni.c)

    image

    备注:红色方框内的只是为了方便演示调试使用,没有额外的功能。

    编写Android.mk和Application.mk 放在jni目录下面。

    结构如图:

    image

    Android.mk文件的内容如下:

    LOCAL_PATH := $(call my-dir)

    include $(CLEAR_VARS)

    LOCAL_MODULE :=hello_jni

    LOCAL_SRC_FILES := hello_jni.c

    include $(BUILD_SHARED_LIBRARY)

    Application.mk 文件内容为:

    APP_ABI := all

    APP_OPIM :=debug

    配置ndk的目录配置文件为图中标红的地方。

    image

    在最后一行添加如下内容:

    ndk.dir=

    配置

    image

    在红色的方框内的文件夹下的红条出添加如下配置:

       ndk{

                moduleName"hello_jni"

            }

    在下图中

    image

    在红色的方框内的文件夹下添加蓝色的内容。

    在如下图中:

    image

    在红色的MainActivity中的oncreate函数中添加蓝色的函数。

    此时android调用C语言的的函数已经完成了,此时运行结构如下图:

    运行结果

    image

    但是想要调试还要做好多的事情。

    调试程序

    在如下图中:

    image

    在红框内的文件中添加蓝色的部分(在android{}内)。

    在下图中:

    image

    在文件androidMainfast.xml中的application 的蓝色框内添加android:debuggable="true"。

    配置编译

    image

    将上图中的jni 的debuging配置为true。

    在终端中进入jni目录下面执行命令

    ndk-build

    目录结构会有如下变化。(红色方框内)

    image

    在进行调试之前在调用到C语言的函数处打一个断点,如图:

     image

    点击debug(红色框内)开始调试:

    image

    此时进入main目录下面执行如下命令。

    ndk-gdb

    之后会出现如下的信息:

    GNU gdb (GDB) 7.6

    Copyright (C) 2013 Free Software Foundation, Inc.

    License GPLv3+: GNU GPL version 3 or later

    This is free software: you are free to change and redistribute it.

    There is NO WARRANTY, to the extent permitted by law.  Type "show copying"

    and "show warranty" for details.

    This GDB was configured as "--host=x86_64-linux-gnu --target=arm-linux-android".

    For bug reporting instructions, please see:

    ---Type to continue, or q to quit---

    .

    warning: Could not load shared library symbols for 86 libraries, e.g. libstdc++.so.

    Use the "info sharedlibrary" command to see the complete listing.

    Do you need "set solib-search-path" or "set sysroot"?

    0xb6f0a794 in __futex_syscall3 ()

       from /root/AndroidStudioProjects/NDK_Sample/app/src/main/obj/local/armeabi-v7a/libc.so

    (gdb) l

    执行“l”命令输入如下

    1       #include

    2       

    6       JNIEXPORT jstring JNICALL Java_com_example_root_ndk_1sample_MainActivity_getstringfromC

    7         (JNIEnv *env, jobject obj)

    8       {

    9           int i = 0,j = 0,k = 0;

    打一个断点在第十行命令如下:

    b 10

    在android studio 单步走,这个时候就会进入断点出,之后就可以执行gdb可以使用的命令进行调试了。

    《完结》

  • 相关阅读:
    vue-router HTML5 History 模式(转自官网)
    使用fastjson解析数据后导致顺序改变问题
    Mybatis一对多或多对多只能查出一条数据解决策略
    mybatis 学习教程
    Mybatis根据List批量查询List结果
    @Param注解的用法解析
    关于mybatis使用小于号大于号出错的解决方案
    if test表达式逻辑判断不能用&&
    MyBatis中传入参数parameterType类型详解
    MyBatis 判断条件为等于的问题
  • 原文地址:https://www.cnblogs.com/android-blogs/p/5712121.html
Copyright © 2011-2022 走看看