原文路径:
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项目目录如图:
进入下图标红的文件 MainActivity文件中
添加如下代码在MainActivity类内
static {
System.loadLibrary("hello_jni");
}
public native String getstringfromC();
打开终端android studio已经提供了终端如图:
首先进入java目录执行命令:
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可以使用的命令进行调试了。
《完结》