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,一经查实,立即删除!

相关文章

elctron项目_electron项目结构介绍

#项目结构my-project├─ .electron-vue(webpack配置文件)│ └─ build.js(生产环境构建代码)│ └─ dev-client.js(热加载相关)│ └─ dev-runner.js(开发环境启动入口)│ └─ webpack.main.config.js(主进程配置文件)│ └─ webpack.renderer.config.js(渲染进程配…

无法启动mysqll1006_CentOS7下MySQL服务启动失败原因及解决方法

在重启阿里的CentOS7服务器后,重启MySQL 出现错误Starting mysqld (via systemctl):Job for mysqld.service failed because the control process exited with error code.See "systemctl status mysqld.service" and "journalctl -xe" fordetails.[FAILED…

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…

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

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

综合基础知识计算机,计算机综合基础知识总结.doc

计算机综合基础知识总结计算机专业知识试题计算机专业知识试题1.???? 一个字节包含的二进制位数是(?? )。A. 8位???? B. 16位???????????????? C. 32位???????????????? D. 256位2.???? 既可作为输入又可作为输出设备的是(???…

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

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

从网络访问计算机不能添加用户名,windows7 和 XP 能互相用\\ip访问,但是不能通过计算机名访问...

只要你的二台机器(winxp、win7)都能PING通对方的IP地址,并且能够通过IP正常访问,只是不能通过同一工作组的计算机名访问(其实,你先PING过一次要使用的对方的计算机名,就能直接在地址栏中输入\\计算机名 来访问了 只是在 网络 中仍…

jitter 如何优化网络_抖音优化该怎么做?

抖音在国内是比较知名的短视频运营商,也有很大的流量市场。这块优化好了,不管是对于用户还是企业来说,在品牌宣传上来说,作用还是蛮大的。抖音优化和电脑端优化,还是有所区别的,这里参考的是点赞数、评论以…

性价比高台式计算机,2021年台式电脑什么牌子好,性价比高?

大家都知道买台式电脑最主要是性价比高,用最少的价钱买到最好的性能配置,但那些大老牌子为了赚平民百姓的钱售价实在贵得太离谱了,性价比非常低今年什么台式电脑性价比最高?台式电脑配置推荐 组装电脑配置单 电脑配置方案-装机...…

golang 数组组合成最小的整数_golang数组-----寻找数组中缺失的整数方法

问题:由n-1个整数组成的未排序数组,元素都是1~n的不同整数,找出其中缺失的整数方法一:思路:是原数组的和 减去 丢失元素后的数组的和,就得到丢失的元素了代码如下:package mainimport ("er…

计算机专业线性代数教学大纲,《线性代数》课程教学大纲

一、课程简介线性代数是讨论代数学中线性关系经典理论的课程,它具有较强的抽象性与逻辑性,是高等学校工科本科各专业的一门重要的基础理论课,也是硕士研究生入学全国统一考试中必考的数学课程之一。由于线性问题广泛存在于科学技术的各个领域…

yuv420p 详解_图文详解YUV420数据格式

一.YUV格式与RGB格式的换算RGB 转换成 YUVY (0.257 * R) (0.504 * G) (0.098 * B) 16Cr V (0.439 * R) - (0.368 * G) - (0.071 * B) 128Cb U -( 0.148 * R) - (0.291 * G) (0.439 * B) 128YUV 转换成 RGBB 1.164(Y - 16) 2.018(U - 128)G 1.164(Y - 16) - 0.813…

计算机存储器发展历史,存储器及其发展历史与前景(4页)-原创力文档

存储器及其发展历史与前景高兴(电子信息科学与技术专业12-1班)摘 要:存储器件是计算机系统的重要组成部分,现代计算机的内存储器多采用半导体存储器。由于RAM的存取速度比ROM快的多,其成为内存的主要组成元件。内存发展主要经历了FP DRAM(快…

jq父级绑定事件的意义_用jQuery.delegate()将事件绑定在父元素上面

1.先看看官方的示例:$(document).ready(function(){$("div").delegate("button","click",function(){$("p").slideToggle();});});这是一个段落。请点击这里2.该方法的定义如下:$(selector).delegate(childSele…