相关概念

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头文件)。
参数:
Android NDK开发(一)HelloWorld_第1张图片

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命令。
Android NDK开发(一)HelloWorld_第2张图片
这说明共享库已经生成了,如果在编译的时候c/c++有错误,根据输出进行修改。如果修改了c/c++代码,重新编译的时候,要把项目根目录下的obj文件夹删除掉,再重新编译。

7、运行项目。

Android NDK开发(一)HelloWorld_第3张图片

更多相关文章

  1. Android 中三种使用线程的方法
  2. android常用颜色代码定义
  3. i.MX android 2.3 R10.3.1 环境( at ubuntu 10.10)
  4. java android 环境变量配置备忘录
  5. [置顶] Linux下安装配置Android开发环境
  6. Android自学笔记(番外篇):全面搭建Linux环境(七)——JDK的安装与配置(
  7. Android Activity onConfigurationChanged()方法 监听状态改变
  8. android 环境的搭建
  9. Android ***测试学习手册(二)准备实验环境

随机推荐

  1. 总结七条助你成为Linux高手的超棒忠告
  2. SQL执行加载顺序
  3. crmeb【pro v1.2】修复小程序授权获取用
  4. MYSQL存储引擎与SQL性能下降原因
  5. 小程序和公众号绑定(通过开放平台)
  6. thinkphp无法加载模块解决办法
  7. Oracle数据科学公开课(1):OCI基础
  8. Java常见排序算法之插入排序
  9. PowerDesigner教程和视频
  10. 小白如何入门Mybatis?这里有答案