原文路径: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可使用的命令进行调试了。
《完结》