`

【NDK学习第二章】如何在自己的项目中使用NDK

    博客分类:
  • NDK
阅读更多
这篇博客实现的是在项目中调用C文件来实现两个数的相加。
本文仅供参考,如果有不足的地方,欢迎指出。



主要有这么几个步骤:



步骤一: 在你的工程中新建一个类,这个类有两个作用,1.通过这个类,和本地C/C++代码打交道,实现代码结构上的耦合。2.javah通过这个类生成.h文件,你可以根据这个.h文件来编写.c文件。



步骤二: 在.c文件编写好了以后,我们就开始编写Android.mk文件,这个文件用来指定.c文件的位置。即告诉NDK,要被编译的.c文件在哪里。



步骤三: 使用cygwin编译生成库文件(.so),成功以后,拷贝到你的项目的libs文件夹下,你就可以在java类中调用库文件(C/C++)了。



步骤1:
新建一个工程:JNIDemo
新建一个类:Calculate.java 通过这个类用来和本地C/C++代码交互,相当于是一个接口的作用。注意:这个类可以不是静态类,只是我认为写成静态的使用起来会比较方便,你也可以不写成静态类。
public class Calculate {

	public static native int plus(int x, int y);
	
	static{
		
		System.loadLibrary("calculate");//要加载的库的名称
	}
}


工程结构:
[img]

[/img]

根据上面的Calculate.java 来生成C的.h头文件,这个头文件的作用是用来定义C的实现,它只和.c文件有关。对于项目的编译和运行没有意义。

具体做法是:通过命令行进入到项目的bin\classes目录下,执行javah命令,如图:
[img]

[/img]


打开你的项目你会在bin\classes目录里面发现一个.h文件,如图:
[img]

[/img]


这时候你就可以根据自动生成的.h文件来编写具体的.c实现文件了:

你可以这样做:在项目根目录下新建一个jni文件夹,将刚才生成的.h文件拷贝进来,然后针对这个.h文件编写具体的实现。剩下的就是业务的问题了。这里贴出我的代码

com_michael_jni_Calculate.c:
#include <string.h>
#include <jni.h>



JNIEXPORT jint JNICALL
Java_com_michael_jni_Calculate_plus( JNIEnv* env,
                                                  jobject thiz,
                                                  jint x,
                                                  jint y )
{
    return x + y;
}







步骤2:
在jni文件夹下编写Android.mk文件,如下:

Android.mk文件用来告诉NDK需要编译的C/C++源文件的位置。

LOCAL_PATH 代表的是.c文件的位置,$(call my-dir)返回Android.mk文件所在目录的路径

LOCAL_MODULE 代表的是共享库的名称

LOCAL_PATH := $(call my-dir)

 

include $(CLEAR_VARS)

LOCAL_MODULE    := calculate
LOCAL_SRC_FILES := com_michael_jni_Calculate.c

include $(BUILD_SHARED_LIBRARY)







步骤3:
在ndk安装目录中的samples文件夹下新建一个文件夹,该文件夹和你的项目名相同,并在这个项目文件夹下新建一个名为jni的文件夹,然后将刚才编写好的Android.mk和.c文件放到这个jni文件夹下,如图:
[img]

[/img]


打开Cygwin.bat,生成库文件,如图:
[img]

[/img]

生成完以后项目文件夹目录下多了libs和obj这两个文件夹,如图:
[img]

[/img]

这个时候,对我们有用的就是libs文件,打开这个文件夹,你可以把里面的armeabi文件整个拷贝到你的项目的libs文件夹下面。


最终的项目结构图为:
[img]

[/img]


这时候你就可以调用你所编写的本地C/C++库(calculate)了。
项目运行的效果如下图:
[img]

[/img]




  • 大小: 38.3 KB
  • 大小: 49.5 KB
  • 大小: 12.2 KB
  • 大小: 13.3 KB
  • 大小: 69.5 KB
  • 大小: 15.3 KB
  • 大小: 47.5 KB
  • 大小: 49.3 KB
分享到:
评论

相关推荐

    Android NDK Beginner’s Guide第二章源码

    Android NDK Beginner’s Guide第二章的完整源码

    eclipse NDK入门实例

    参考黄书《Android应用安全防护和逆向分析》第二章Android NDK开发2.1.1节以及百度经验 Android NDK入门开发实例(https://jingyan.baidu.com/article/37bce2be191ed51003f3a278.html)即可完成该实例

    Android C++高级编程:使用NDK_Onur Cinar, 于红PDF电子书下载 带书签目录 完整版

    7.3.1 在原生代码中使用POSIX线程 168 7.3.2 用pthread_create创建线程 168 7.3.3 更新示例应用程序以使用POSIX线程 169 7.3.4 执行POSIX线程示例 174 7.4 从POSIX线程返回结果 174 7.5 POSIX线程同步 176 ...

    Android和PHP开发最佳实践第2版(高清带详细目录书签)Pdf版及epub电子书版

    目录第一篇 准备篇 第1章 学前必读 第2章 Android开发准备 第3章 PHP开发准备第二篇 实战篇第4章 实例产品设计 第5章 程序架构设计 第6章 服务端开发 第7章 客户端开发第三篇 优化篇第8章 性能分析 第9章服务端优化 ...

    《Android开发权威指南》 PDF (安卓sdk 2.3)

    第二部分 基础篇,包括第3章~第16章,第3章 Android程序设计基础、第4章 用户界面开发基础、第5章 控件(Widget)详解、第6章 菜单、第7章 信息提醒(对话框、Toast与Notification)、第8章 数据存储、第9章 Android...

    Android开发权威指南

    第二部分 基础篇,包括第3章~第16章,第3章 Android程序设计基础、第4章 用户界面开发基础、第5章 控件(Widget)详解、第6章 菜单、第7章 信息提醒(对话框、Toast与Notification)、第8章 数据存储、第9章 Android...

    [Android开发权威指南].李宁.扫描版.pdf

    第二部分 基础篇 第3章 千里之行始于足下 Android程序设计基础 第4章 我的UI我做主 用户界面开发基础 第5章 良好的学习开端 控件 Widget 详解 第6章 友好的菜单 Menu介绍与实例 第7章 友好地互动交流 信息提醒 ...

    Android应用开发揭秘.rar

    前言 第一部分 准备篇 第1章 Android开发简介 第2章 Android开发环境搭建 第二部分 基础篇 第3章 Android程序设计基础 第4章 用户界面开发 第5章 Android游戏开发 第6章 Android数据存储 第7章 多媒体开发 第8章 ...

    Android应用程序使用JNI调用驱动程序

    基于老罗的《Android内核源代码情景分析》第二章freg实例,使用NDK编译jni层从而调用驱动程序,能大大缩短项目开发周期。

    Android开发权威指南 第二版

    《Android开发权威指南(第二版)》是畅销书《Android开发权威指南》的升级版,内容更新超过80%,是一本全面介绍Android应用开发的专著,拥有45章精彩内容供读者学习。, 《Android开发权威指南(第二版)》全面介绍了...

    《Android应用开发揭秘》附带光盘代码.

    《Android应用开发揭秘》全部实例源代码,... 16.4 AndroidNDK中使用0penGL  16.5小结  第17章 Android脚本环境  17.1 Android脚本环境简介  17.2 Android脚本环境安装  17.3如何编写Android脚本程序  17.4小结

    《Android应用开发揭秘》源码

    作者简介  杨丰盛,Android应用开发先驱... 16.4 AndroidNDK中使用0penGL  16.5小结  第17章 Android脚本环境  17.1 Android脚本环境简介  17.2 Android脚本环境安装  17.3如何编写Android脚本程序  17.4小结

    OpenGL ES 3.0

     第9章的重点是如何在片段着色器中使用纹理,第10章介绍编写片段着色器所需知道的其他知识。该章概述了片段着色器和所有可用的特殊内建变量,还演示了用片段着色器实现OpenGL ES 1.1中所有固定功能技术的方法。多重...

    Android应用开发揭秘pdf高清版

    内容提要 ------------------------------------------...16.4 AndroidNDK中使用0penGL 16.5小结 第17章 Android脚本环境 17.1 Android脚本环境简介 17.2 Android脚本环境安装 17.3如何编写Android脚本程序 17.4小结

    Android开发艺术探索.任玉刚(带详细书签).pdf

    第二,结合Android源代码和应用层开发过程,融会贯通,介绍一些比较深入的知识点;第三,介绍一些核心技术和Android的性能优化思想。 第1章 Activity的生命周期和启动模式 1 1.1 Activity的生命周期全面分析 1 ...

Global site tag (gtag.js) - Google Analytics