android c++ gizp 调用 so,使用ndk-build编译 android调用的so库

前沿

编译so的方法有两种方法第一种就是编写原生的makefile文件利用gcc进行编译,这里我讲解的是另外一种。采用NDK提供的ndk-build编译。

简介

使用ndk编译的时候需要介绍它的脚本文件,Android.mk和Application.mk,但是Application.mk是可选的,用来描述原生程序用到的一些特性,如原生程序支持的ARM指令集。

Android.mk是工程的编译脚本,描述了编译原生程序所需要的选择项、头文件、源文件以及依赖库等。

实例

首先需要下载DNK,这个就不用多说了,我直接来说步骤吧。程序员一般都会对Hello,world感到亲切,我们就从hello,word开始。利用eclipse新建一个项目我取了新建了一个andoridNDKTest这个项目,先看看项目目录吧。

cc53b27264444fcfdb825aaa6e9acc70.png

这里注意到上面的多了一个jni目录,这个目录就是java通过jni调用的代码放的地方,里面放了三个文件,我们还是首先来讲一下hello-jni.c这个文件,我们来看看代码。

#include 

#include 

jstring

Java_com_example_ndktest_MainActivity_stringFromJNI( JNIEnv* env,

jobject thiz )

{

return (*env)->NewStringUTF(env, "Hello world ");

}

代码很简单就是命名有点长,第一个Java不用管就是jni的规定,然后后面的就是包路径和类名称最后是函数名。这个函数的作用就是返回一个字符串。

然后就是利用ndk来编译这个函数了,我们需要看看Android.mk和Applicaion.mk文件里面到底有些什么。

android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello

LOCAL_SRC_FILES := hello-jni.c

include $(BUILD_SHARED_LIBRARY)

LOCAL_PATH:=($call my-dir)定义了本地源码路径 call my-dir是编译系统提供的,返回的就是mk的路径。

include $(CLEAR_VARS) 指定让编译系统清楚掉一些已经定义过的宏,这些宏定义都是全局的,如LOCAL_MODULE、LOCAL_SRC_FILE,当一个GUN MAKE在编译多个模块时候,必须清楚并且重新设置他们。

LOCAL_ARM_MODE := arm指定原生程序用的指令集,这里上面我们没有用到。

LOCAL_MODULE:= hello指定生成程序的文件名,如果生成共享的库模块会生成libhello.so.

LOCAL_SRC_FILE:=hello-jni.c指定c或者c++源文件。

inlude $(BUILD_EXECUTABLE)指定生成文件的类型,BUILD_EXECUTABLE表示可执行文件,BUILD_SHARED_LIBRARY表示生成动态库,BUILD_STATIC_LIBRARY静态库。

然后是Applicaion.mk文件

APP_ABI := all

这句代码的意思是生成所有平台的编译结果。

其实到了这里你就可以直接进入jni文件夹里面输入ndk-build开始编译了,但是为了看到编译过后的运行结果我这里在eclipse里面编译,看图说话。

e4bc1427e77114778e958c50575e728d.png

98fdd6a85201f6938a6afd73e456cabd.png

a740f741d62700bdc377a56ed3cb3282.png

然后编译器就会自动的编译文件,最后就是android这边的调用了,我们来看看andorid的文件代码

public class MainActivity extends Activity {

//声明c的接口

public native String stringFromJNI();

static {

System.loadLibrary("hello");

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

TextView textView = (TextView) findViewById(R.id.hello);

textView.setText(stringFromJNI());

}

}

然后让我们注意的是这句代码

public native String stringFromJNI();

其实它就是函数生命,但是采用的native因为是在so里面的。

static {

System.loadLibrary("hello");

}

这句函数就更简单了,直接加载我们刚才编译好的so库。好了,如果没什么问题就直接run在手机上看效果吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/530078.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html5判断多选框是否选择的函数,复选框(checkbox)、多选框

1、需求分析可同时选中多个选项,实现全选、全不选、反选等功能。2、技术分析基础的HTML、CSS、JavaScript。3、详细分析3.1 HTML部分图示是一个列表加底部一段文字说明,列表包含三个部分,整体是一个多选列表,上部是总的选项&#…

layer调用父页面方法_Ruby for SketchUp之图层【Layer】

我们学习了群组、组件及组件定义,今天来看看图层【Layer】,在Sketchup2020版本中已经更名为“标记”,如图那么图层在我们建模过程中能带来哪些便利呢?可以快速的隐藏同一图层内所有东西,而不需要逐一选择并右键点击隐藏…

html盒子有哪些属性,盒子模型有哪些属性 在html5中哪些元素具有盒子模型

HTML盒模型基本属性有哪些CSS盒子模型就是在CSS技术所使用的一种思维模型。CSS假定所有的HTML文档元素都生成一个描述该元素在HTML文档布局中所占空间的矩形元素框,可以形象地将其看作是一个盒子。通过定义一系列与盒子相关的属性,可极大地丰富和促进各个…

huffman编码的程序流程图_F28379D之CLB解码多摩川编码器2——LIB版例程讲解(原创)...

我在第一篇文章中已经跟大家介绍过379解码多摩川编码器的一些入手小知识,链接如下TMS320F28379D之CLB解码多摩川编码器1——入手小知识(原创)请大家一定要看入手小知识,再来看例程分析。今天跟大家分析一下TI的官方例程。首先&…

html统计表合并单元格的快捷键,word怎样设置合并单元格快捷键

word2010中合并单元格的快捷键是什么?求解答。合并单元格没有快捷键,不过有个f4是重复上一步操作,所以你要合并多个单元格,那么你可以先点一合并单元格,然后选定你要合并的区域。WORD合并单元格的快捷键怎么设置word合并单元格快…

fcm 服务器接入 golang_Golang 写的即时通讯服务器 im(服务组件形式)

简要介绍im是一个即时通讯服务器,代码全部使用golang完成。主要功能1.支持tcp,websocket接入2.离线消息同步3.单用户多设备同时在线4.单聊,群聊,以及超大群聊天场景5.支持服务水平扩展gim和im有什么区别?gim可以作为一…

html 手机分辨率,移动端各种分辨率手机屏幕----适配方法集锦

1.使用viewport,html文件中在内添加meta,简单粗暴:2.加判断复杂点的viewport,可以封装成一个js,每次新建html时调用.js即可:var phoneWidth parseInt(window.screen.width);var phoneScale phoneWidth/75…

橡胶支座抗压弹性模量计算公式_隔震支座的这些力学特性您都掌握了吗?

隔震支座叠层橡胶隔震支座,是隔震设计中应用最为广泛的隔震装置。了解隔震支座的力学特性,在软件中设置正确的参数,是做好隔震设计最基本的前提。那么,隔震支座的这些特性您都掌握了吗?叠层橡胶隔震支座叠层橡胶隔震支…

asp.net button创建控件时出错_Tkinter Radiobutton控件

单选按钮是一种可在多个预先定义的选项中选择出一项的 Tkinter 控件 。单选按钮可显示文字或图片,显示文字时只能使用预设字体,该控件可以绑定一个 Python 函数或方法,当单选按钮被选择时,该函数或方法将被调用。单选按钮&#xf…

计算机师范类算师范教育类吗,师范教育类专业和计算机类专业,两者相比,哪个更适合自考生报读...

原标题:师范教育类专业和计算机类专业,两者相比,哪个更适合自考生报读一、师范教育类专业大部分毕业生的就业方向都是在教育行业,互联网的发展,教学教育有了网络课,让人们随时随地都可以学习,也…

android 绘画笔迹回放_随时记录分享书写笔迹,EverPEN高级版套装体验

看到笔记本就想起小时候,老师为了提高学生们的写作能力,而要求大家每周写3篇日记,几年下来慢慢的让自己养成了每周会抽出点时间,手写些生活中的点滴趣事。但随着笔记本保持时间有限,而且有时查找起来也不方便&#xff…

12c集群日志位置_Kubernetes(k8s)那些套路之日志收集

准备关于容器日志Docker的日志分为两类,一类是 Docker引擎日志;另一类是容器日志。引擎日志一般都交给了系统日志,不同的操作系统会放在不同的位置。本文主要介绍容器日志,容器日志可以理解是运行在容器内部的应用输出的日志&…

数字摄像头测试软件,图像测量软件(Camera Measure)

Camera Measure是一款简单易用的数字图像测量工具,该软件可用于显微镜图像测量、测绘等专业领域或者普通用户日常的各种测量,可以播放Windows相机并拍照或录制视频,打开图片或视频文件,并在画面中进行实时的高性能图像测量。软件功…

过滤特征_机器学习深度研究:特征选择中几个重要的统计学概念

机器学习深度研究:特征选择过滤法中几个重要的统计学概念————卡方检验、方差分析、相关系数、p值问题引出当我们拿到数据并对其进行了数据预处理,但还不能直接拿去训练模型,还需要选择有意义的特征(即特征选择)&am…

win10计算机优化技巧,让Win10系统运行更流畅的优化技巧

虽然Win10系统对配置要求不高,在普通条件电脑的环境中也能流畅运行。但是用户总不会介意进一步优化Win10,让Win10在流畅的基础上变得更流畅一些。本文就来介绍一下让Win10系统更流畅的优化技巧。Win10优化技巧1、用360优化win10后开不了机的问题原因是禁…

c include 多层目录_python+C、C++混合编程的应用

TIOBE每个月都会新鲜出炉一份流行编程语言排行榜,这里会列出最流行的20种语言。排序说明不了语言的好坏,反应的不过是某个软件开发领域的热门程度。语言的发展不是越来越common,而是越来越专注领域。有的语言专注于简单高效,比如p…

校友会2019中国大学计算机,校友会2019中国计算机类一流专业排名,清华大学排名第一...

原标题:校友会2019中国计算机类一流专业排名,清华大学排名第一中国哪些高校的计算机类本科专业跻身2019世界一流专业、中国顶尖专业和中国一流专业行列?哪些计算机类本科专业是2019年中国高考最优秀考生的最佳选择?为了给2019年全…

查询结果取交集_Elasticsearch 查询过程中的 prefilter 原理

大家都知道在对索引执行查询的时候,需要在所有的分片上执行查询,因为无法知道被查询的关键词位于哪个分片,对于全文查询来说诚然如此,然而对于时序型的索引,当你从 my_index-* 中执行 now-3d 的范围查询时,…

语音识别插件_AnsweringMachine XS: 越狱理由之二,iPhone 电话语音答录机

Apps & Tweaks| Jailbreak Guide| iDevicesTweak:AnsweringMachine XSVersion:XSRepo:http://limneos.net/iOS Support:12-13Price:3.99iOS 开发人员 Elias Limneos 开发了电话辅助系列插件,AnsweringM…

计算机账务处理流程图,账务处理流程图

手工业务流程图账务处理流程主要有 5 种形式:记账凭证核算形式、科目汇总表核算形式、汇总记账凭证核算形式、日记总账核算形式、和多栏式日记账核算形式。不同的账务处理流程其差别主要体现在登记总账的方法和依据不同,其中科目汇总表核算形式最为常见&…