android studio C/C++ jni 編寫以及調試方法

 

原文路徑:html

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

目錄linux

開發環境 2android

編寫hello_jni程序 2c++

運行結果 10redis

調試程序 10app

開發環境

IDE: android studio 1.1.0函數

android NDK :R10ui

android SDK : android -19spa

編寫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可使用的命令進行調試了。

《完結》

相關文章
相關標籤/搜索