Android NDK开发(一)HelloWorld
相关概念
1、什么是NDK?
The NDK is a toolset that allows you to implement parts of your app
using native-code languages such as C and C++. Typically, good use
cases for the NDK are CPU-intensive applications such as game engines,
signal processing, and physics simulation.
NDK是工具,包括编译链接nitive代码的功能,调试功能。
2、什么是jni?
The JNI is a native programming interface. It allows Java code that
runs inside a Java Virtual Machine (VM) to interoperate with
applications and libraries written in other programming languages,
such as C, C++, and assembly.
JNI是语言层面上让java和c/c++可以交互的基础。
3、什么是javah?
使用Javah 可以获取您的 Java 源文件并生成 C/C++头文件,其中包含您的 Java 代码中所有本地方法(native方法)的 JNI 存根(stub,C头文件)。
参数:
4、什么是javap?
javap是JDK自带的反汇编器,我们可以通过它获得方法的签名。
搭建环境
这里我用Eclipse进行NDK开发,后面的文章会写在Android Studio上搭建NDK环境:
1、下载NDK并解压
下载地址在这里http://developer.android.com/ndk/downloads/index.html
,为了以后使用方便,把解压后的路径添加到PATH环境变量。
2、安装cygwin
cygwin是在windows系统下模拟一个linux环境的工具,因为NDK里的脚本需要在linux环境下执行,当然也有windows的脚本,但是有时会出现莫名其妙的问题。如果是linux或ma ox用户不用安装。https://cygwin.com/install.html
PS
在上面的下载过程中如果被墙,可以自行百度,应该有不少好心网友传到网络硬盘里的。
Hello World
在这里实现一个方法,使用java调用c语言的方法,在控制台打印Hello World。
1、在java代码里编写包含native关键字的方法。
public class MainActivity extends Activity { static { System.loadLibrary("helloworld"); } public native void helloWorld(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); helloWorld(); }}
2、在命令行,cd 到src目录下,执行命令
javah -jni net.qingtian.qttestc.MainActivity
就会在src目录下生成一个net_qingtian_qttestc_MainActivity.h的头文件。
3、在项目跟目录下创建jni文件夹,把第二步生成的net_qingtian_qttestc_MainActivity.h头文件拷贝在该目录下。
4、 在jni目录下新建一个c代码源文件,叫helloworld.c,在helloworld.c里实现net_qingtian_qttestc_MainActivity.h头文件里的方法
#include "net_qingtian_qttestc_MainActivity.h"#include <android/log.h>JNIEXPORT void JNICALL Java_net_qingtian_qttestc_MainActivity_helloWorld (JNIEnv * env, jobject obj){ __android_log_print(ANDROID_LOG_INFO, "qingtian", "Hello World From C");}
关于打印log的方法,可以去${ndk_dir}/platforms/android-14/arch-arm/usr/include/android/log.h头文件里去查看。
5、 在jni下编写Android.mk
这是和编译打包有关系的脚本文件
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)# 对应打包成函数库的名字LOCAL_MODULE := helloworld# 对应c代码的文件LOCAL_SRC_FILES := helloworld.cLOCAL_LDLIBS += -lloginclude $(BUILD_SHARED_LIBRARY)
关于Android.mk文件的更多介绍,可以去${ndk_dir}/docs/ANDROID-MK.html查看。
6、编译共享库。
在linux环境下切换到项目根目录(cygwin),执行ndk-build命令。
这说明共享库已经生成了,如果在编译的时候c/c++有错误,根据输出进行修改。如果修改了c/c++代码,重新编译的时候,要把项目根目录下的obj文件夹删除掉,再重新编译。
7、运行项目。
更多相关文章
- Android 中三种使用线程的方法
- android常用颜色代码定义
- i.MX android 2.3 R10.3.1 环境( at ubuntu 10.10)
- java android 环境变量配置备忘录
- [置顶] Linux下安装配置Android开发环境
- Android自学笔记(番外篇):全面搭建Linux环境(七)——JDK的安装与配置(
- Android Activity onConfigurationChanged()方法 监听状态改变
- android 环境的搭建
- Android ***测试学习手册(二)准备实验环境