原文路徑:html
http://blog.sina.com.cn/s/blog_ad64b8200102vnxl.htmljava
目錄linux
開發環境 2android
運行結果 10redis
調試程序 10app
IDE: android studio 1.1.0函數
android NDK :R10ui
android SDK : android -19spa
創建一個空的activity項目目錄如圖:
進入下圖標紅的文件 MainActivity文件中
添加以下代碼在MainActivity類內
static {
System.loadLibrary("hello_jni");
}
public native String getstringfromC();
打開終端android studio已經提供了終端如圖:
javah -d ../jni com.example.root.ndk_sample.MainActivity
com.example.root.ndk_sample.MainActivity是native函數的所在的包名和類名,中間使用「.」號分開。
這時候就會在java目錄下面出現jni目錄如圖:
添加*.c文件在jni目錄中如圖:(文件名字爲hello_jni.c)
備註:紅色方框內的只是爲了方便演示調試使用,沒有額外的功能。
編寫Android.mk和Application.mk 放在jni目錄下面。
結構如圖:
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的目錄配置文件爲圖中標紅的地方。
在最後一行添加以下內容:
ndk.dir=
配置
在紅色的方框內的文件夾下的紅條出添加以下配置:
ndk{
moduleName"hello_jni"
}
在下圖中
在紅色的方框內的文件夾下添加藍色的內容。
在以下圖中:
在紅色的MainActivity中的oncreate函數中添加藍色的函數。
此時android調用C語言的的函數已經完成了,此時運行結構以下圖:
可是想要調試還要作好多的事情。
在以下圖中:
在紅框內的文件中添加藍色的部分(在android{}內)。
在下圖中:
在文件androidMainfast.xml中的application 的藍色框內添加android:debuggable="true"。
配置編譯
將上圖中的jni 的debuging配置爲true。
在終端中進入jni目錄下面執行命令
ndk-build
目錄結構會有以下變化。(紅色方框內)
在進行調試以前在調用到C語言的函數處打一個斷點,如圖:
點擊debug(紅色框內)開始調試:
此時進入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可使用的命令進行調試了。
《完結》