这篇博客实现的是在项目中调用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
分享到:
相关推荐
NDK是Google提供的一套工具集,允许开发者在Android平台上使用C和C++编写原生代码,从而提高性能、优化资源使用,并能够利用已有的C/C++库。本章节的源码提供了实际操作的例子,帮助读者深入理解NDK开发的基本概念和...
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应用安全防护和逆向分析》第二章Android NDK开发2.1.1节以及百度经验 Android NDK入门开发实例(https://jingyan.baidu.com/article/37bce2be191ed51003f3a278.html)即可完成该实例
- 在Android NDK中,可以使用pthread库进行多线程编程,提高应用的并发处理能力。 - 理解线程同步机制,如互斥锁、条件变量等,是避免数据竞争的关键。 6. **OpenCV、SDL等库的集成**: - 书中可能涉及如何将...
- **多线程支持**:介绍如何在NDK应用中使用多线程技术来提高程序性能。 3. **第3章:高级主题** - **性能优化技巧**:分享一系列提高NDK应用性能的方法,如使用向量化指令集等。 - **调试技巧**:教授如何有效...
在Android NDK中进行多线程编程,用于实现并发操作。可能包括线程同步、互斥锁、条件变量等概念。 6. **Chapter02** - 性能优化 讲解如何利用NDK进行性能优化,如代码优化技巧,以及如何使用NDK的工具进行性能...
进入第二章的源码学习,我们将重点关注以下几个方面: 1. **活动(Activity)**:Activity是Android应用的基本组件,代表用户可以看到和交互的界面。源码可能包含多个Activity的实现,展示如何启动、切换和管理它们...
2. 第二章:Android SDK及开发环境搭建,学习SDK的版本演变,掌握Eclipse ADT插件的安装、更新,熟练设置和使用Android模拟器,通过实例创建第一个Hello World项目和导入RssReader开源项目。 3. 第三章:Android项目...
以《Android内核源代码情景分析》第二章的freg实例为例,freg是一个简单的设备驱动程序,展示了如何在用户空间调用驱动程序。在Android应用程序中,我们可以使用JNI来调用这个驱动,实现读写操作或者其他特定功能。 ...
目录第一篇 准备篇 第1章 学前必读 第2章 Android开发准备 第3章 PHP开发准备第二篇 实战篇第4章 实例产品设计 第5章 程序架构设计 第6章 服务端开发 第7章 客户端开发第三篇 优化篇第8章 性能分析 第9章服务端优化 ...
第二部分 基础篇,包括第3章~第16章,第3章 Android程序设计基础、第4章 用户界面开发基础、第5章 控件(Widget)详解、第6章 菜单、第7章 信息提醒(对话框、Toast与Notification)、第8章 数据存储、第9章 Android...
第二部分 基础篇 第3章 千里之行始于足下 Android程序设计基础 第4章 我的UI我做主 用户界面开发基础 第5章 良好的学习开端 控件 Widget 详解 第6章 友好的菜单 Menu介绍与实例 第7章 友好地互动交流 信息提醒 ...
1. **第二章:Android系统架构** - 这一部分可能介绍Android系统的层次结构,包括Linux内核、HAL(硬件抽象层)、系统库、运行时环境和应用程序框架。 2. **第三章:Android Studio入门** - 这一章可能会涵盖如何...
第11章《Android NDK开发》:介绍了使用NDK进行原生代码开发,如C++,以提高性能或利用已有的C/C++库。还会讲解JNI(Java Native Interface)的使用,以及如何将原生代码与Java代码相互调用。 第12章《综合示例设计与...
第二章 Android 技术与理论,讨论了安卓系统的开发简介和安卓应用程序的构成和工作机制;第三章 需求分析,讨论了读书郎学习app的需求分析;第四章 可行性分析,讨论了读书郎学习app的可行性分析;第五章 功能分析,...
前言 第一部分 准备篇 第1章 Android开发简介 第2章 Android开发环境搭建 第二部分 基础篇 第3章 Android程序设计基础 第4章 用户界面开发 第5章 Android游戏开发 第6章 Android数据存储 第7章 多媒体开发 第8章 ...