Android studio JNI jni实例

1.Jni的作用

 

1.Jni的作用

Java是一种比较高级的语言,Java调用c库,调用c++库是必不可少的,所以Jni就应运而生了。看了这个文章的同学,应该能够自己写个APK装在自己的手机里面吧,以前刚开始做android的时候,写了一个“地瓜手电筒”和一个音乐播放器。

NDK:NDK是Native Development Kit的缩写,是Google提供的一套工具集,可以让你其他语言(C、C++或汇编)开发 Android的 JNI。NDK可以编译多平台的so,开发人员只需要简单修改 mk 文件说明需要的平台,不需要改动任何代码,NDK就可以帮你编译出所需的so库。

JNI:JNI是Java本机接口(Java Native Interface),是一个本机编程接口,它是Java软件开发工具箱(Java Software Development Kit,SDK)的一部分。JNI允许Java代码使用以其他语言编写的代码和代码库。Invocation API(JNI的一部分)可以用来将Java虚拟机(JVM)嵌入到本机应用程序中,从而允许程序员从本机代码内部调用Java代码。不过,对Java外部的调用通常不能移植到其他平台,在applet中还可能引发安全异常。实现本地代码将使您的Java应用程序无法通过100%纯Java测试。

 

2.生成一个JNI 的libjni.so库

我这个例子主要是在有android源码的编译环境下测试的,我有Android 7.1的开发编译环境,如果大家做Android 系统开发或者应用开发,有一个Android的开发环境非常有必要,或者需要自己下载Android NDK。

 

2.1.在源码位置下新建一个源码路径

HelloWorld.java源码如下

package com.wqf.hellojni;public class HelloWorld{public static native String helloWorld();public static native int add(int a,int b);}

 

2.2 用命令编译生成头文件

1、用命令

javac com/wqf/hellojni/HelloWorld.java

生成HelloWorld.class
2、用命令

javah -classpath . -jni com.wqf.hellojni.HelloWorld

生成头文件

注意:
网上很多说明用

javah -jni com.wqf.hellojni.HelloWorld 

生成头文件,我试过很多次,都是失败,还是用我上面那个命令,可以看看javah的命令帮助

 

2.3 编译生成libjni.so库步骤

2.3.1 在jni目录里面建立几个文件如下

1、把上面生成的

com_wqf_hellojni_HelloWorld.h

放到这个目录来
2、新建一个jni.c文件用来实现上面头文件里面的方法
3、新建一个Android.mk文件用来编译

Android.mk的内容如下

#########################################
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= jni.c
LOCAL_MODULE := libjni 
include $(BUILD_SHARED_LIBRARY)  

 

2.3.2 jni.c的内容如下

关于JNI的语法大家可以自行百度看看,说明的很多,这里不再详细说明,下面也比较简单。

//自己创建一个c文件,实现自己定义的native方法,也就是.h文件中的方法
//引入自己生成的.h头文件
#include "com_wqf_hellojni_HelloWorld.h"//返回一个字符串
JNIEXPORT jstring JNICALL Java_com_wqf_hellojni_HelloWorld_helloWorld(JNIEnv *env, jclass jobj) {return (*env)->NewStringUTF(env,"HelloWorld 我是用jni调用出来的字符串");
}
//返回 a+b的结果
JNIEXPORT jint JNICALL Java_com_wqf_hellojni_HelloWorld_add(JNIEnv *env, jclass jobj, jint a, jint b){return a+b;
}

 

2.3.3 编译

使用mm -B 命令编译生成so文件编译结果如下图
说个小细节,我们编译生成的libjni.so,我们要会看他的几个参数
1、文件类型,使用file命令查看是32位的库还是64位的库
2、使用md5sum命令查看md5码,这个可以查看文件的唯一md5码,以后遇到一个文件名字一样的可以用这个方式知道是不是同一个文件

 

3. 写个简单的apk测试一下

我们的APK编写用的是android studio来编写的,现在android studio是非常主流的android开发工具,如果大家想自己做一个小的DEMO的话,建议装这个工具,网上安装流程非常多了,下载SDK后,最好不要放在C盘,要不然重装系统后又没有了。

3.1先来一个整体的运行效果图片

注意:HelloWorld.java的包名要跟com_wqf_hellojni_HelloWorld .h上面生产库头文件对应起来,要不然运行会出现问题,要特别注意。

我们在图片上可以看到add = 9,这个是我们在JNI里面的输出结果

 

3.2 APK编译步骤和几个注意的细节

我是在Android 7.1上编写APK进行测试的,相比其他Android版本,Android 7.1的问题更多,我说下操作步骤和细节。

3.2.1、我们先编写一个可以运行的APK

我们需要编写一个helloworld的简单apk,这个apk不需要引用库文件,直接输出一个helloworld。
 

3.2.2、然后我们引用我们的库文件

这里注意的是HelloWorld.java 里面的内容
加载库的代码

package com.wqf.hellojni;public class HelloWorld{static {//名字必须和libjni.so 名字对应起来System.loadLibrary("jni");}public static native String helloWorld();public static native int add(int a,int b);}

在MainActivity.java里面导入包并调用add函数

 

4. 源码连接

源码我放在github上面,方面查看,有源码的例程大家研究起来更加得心应手
https://github.com/weiqifa0/androidjni

参考:
https://blog.csdn.net/a_zhon/article/details/53097512#

 

     

欢迎加我微信拉大家进微信技术讨论群

 

 

欢迎关注微信公众号-嵌入式Linux

觉得不错,请帮忙转发,您的每一次支持,我都将铭记于心

 

 

 

 

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

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

相关文章

二叉树先序遍历,中序遍历,后序遍历,层次遍历学习总结及完整C/C++代码

伪代码阐述 先序遍历 先序遍历:先访问根节点, 然后深入左子树,直到不能深入时再深入右子树 由定义可得递归式 void travPre_R(BinNodePosi* x,VISIT& visit){if(!X) return; //到达叶子节点,开始回归visit(x->data);//向左子树深入的过程中便开始进行对每个节点的数据…

nedc工况_东南DX3 EV续航升级 NEDC综合工况续航451公里

东南DX3 EV续航升级版车型曝光,电池系统能量密度由之前的141Wh/kg提升至了161Wh/kg,NEDC综合工况续航也由老款产品的351km提升至了451km。近日,工信部公布了2019年第7批《新能源汽车推广应用推荐车型目录》,东南DX3 EV续航升级版车…

不笑找我系列 | 程序员爆笑漫画十条

原创翻译~ 转载请说明出处~~~~~~~~ 1、如果你让码农给你做个事情,比如修个灯泡,他会这样去执行你的指令 2、分享一个码农发现并解决bug的过程,实在是符合我们码农的人设 3、码农的一天,像极了我的一天 4、至今为止,没…

AVL树学习总结

AVL树 平衡二叉树的缺点 由于平衡二叉搜索树的search(), insert(),remove()接口的运行时间与二叉树的高度成正比,所以若不能有效控制树高, 从平均复杂度来看,二叉平衡搜索树并不能让人满意 理想平衡 二叉树的性能取决于树的高度,只有当左右子树的高度接近时才能达到理想平衡…

nginx编译安装_Nginx编译安装nginx-upsync-module模块以实现动态负载

安装依赖包OpenSSL在官网下载页下到最新稳定版1.0.2q。PCRE在 PCRE 官网可以找到下载地址,这里选择8.x的最高版本 pcre-8.42.tar.gz。zlibzlib 直接选择官网首页最新的zlib-1.2.11.tar.gz。下载nginx 源码包及nginx-upsync-module模块源码这里下载的是nginx稳定版ng…

码农笑话图片十张

原创翻译~转载请说明出处~~~~~~~~1、如果你让码农给你做个事情,比如修个灯泡,他会这样去执行你的指令2、分享一个码农发现并解决bug的过程,实在是符合我们码农的人设3、码农的一天,像极了我的一天4、至今为止,没有遇到…

伸展树学习总结

伸展树 与AVL树类似, 伸展树也是二叉搜索树的一种形式, 伸展树无需保证时刻保持全树的平衡,也不需要像AVL树一样要求记录平衡因子的附加信息 伸展树的提出源于信息访问的局部性(刚被访问过的信息有可能再次被访问,要被访问的元素可能位于刚访问过的元素的附近), 就伸展树而言…

c语言 库打印函数

函数#include<stdio.h>int printf(const char *format, ... );/* [until c99]写结果到stdout */int printf(const char *restrict format, ... );/* [since c99] */int fprintf(FILE *stream, const char *format, ... );/* [until c99]写结果到文件流stream */int fprin…

xhprof windows下安装和使用(转载)

1、使用5.3.3以上的php版本&#xff0c;或者直接下载wamp2.1集成环境。 2、下载xhprof for windows版本&#xff0c;地址&#xff1a;http://www.benjamin-carl.de/?downloadXHProf-0.10.0-PHP-5.3.3-VC6-x86-TS&#xff0c;把解压后的dll文件放到php的ext目录里面。 关于这个…

B树学习总结

B树 多路搜索树 当数据规模足够大的时候, 大部分数据存储到外存中, 常规的平衡二叉搜索树将无法满足需求理由如下: 常规二叉平衡搜索树每当进行search(),insert(),remove()操作的时候就会进行节点的切换,从而导致大量的IO操作,就此提出了多路搜索,尝试将原本的多个节点合在一…

嵌入式未来趋势是什么?

感谢CSDN编辑邀请 前几天通过了CSDN博客专家的申请&#xff0c;在CSDN博客摸爬滚打多少个日日夜夜后终于修成正果了&#xff0c;当时通过CSDN博客专家时赶紧把消息发给了以前的创新基地同学&#xff0c;想起来&#xff0c;我们那时候刚开始学习单片机&#xff0c;就是从CSDN上面…

js动态添加删除节点

转载于:https://www.cnblogs.com/jiaobaobao/p/6762692.html

书中自有黄金屋~外加中奖结果通知

人生的路很长&#xff0c;很艰辛&#xff0c;只有不断学习才能超越梦想&#xff0c;大牛是如何成长的&#xff01;首先要多看多听多写~~今天推荐一些大牛们都关注的技术公众号&#xff0c;机器学习、架构、前端、嵌入式、PY学习.....希望能够帮助到大家&#xff0c;引领我们前行…

拨号云服务器怎么自动配置网关_云服务器配置网站卡慢怎么办

网站访问卡慢有很多原因&#xff0c;一次完整的 HTTP 请求包括域名解析、建立 TCP 连接、发起请求、云服务器接收到请求进行处理并返回处理结果、浏览器对 HTML 代码进行解析并请求其他资源&#xff0c;以及对页面进行渲染呈现。其中&#xff0c;HTTP 的请求过程经历了用户本地…

手机java软件_浅谈软件开发就业前景

​  我国信息化人才培养还处于发展阶段&#xff0c;导致社会实际需求人才基数远远大于信息化人才的培养基数&#xff0c;使得数以万计的中小企业急需全面系统掌握软件开发基础技能与知识的软件工程师。目前对软件已达20万并且以每年20%左右的速度增长。在未来5年内合格软件人…

ufldl学习笔记与编程作业:Multi-Layer Neural Network(多层神经网络+识别手写体编程)...

ufldl学习笔记与编程作业&#xff1a;Multi-Layer Neural Network(多层神经网络识别手写体编程) ufldl出了新教程&#xff0c;感觉比之前的好&#xff0c;从基础讲起&#xff0c;系统清晰&#xff0c;又有编程实践。 在deep learning高质量群里面听一些前辈说&#xff0c;不必深…

sql查询无结果返回空_3分钟短文 | Laravel 查询结果检查是不是空,5个方法你别用错...

引言Laravel 提供了 Eloquent ORM 对象用于操作数据库&#xff0c;将其进行抽象方便操作。因为设计的灵活度&#xff0c;大家在使用Model查询数据集的时候&#xff0c;会面临结果为空&#xff0c;记录不存在的问题&#xff0c; 那么如何有效地判断查询记录为空呢&#xff1f;本…

深度优先搜索小结

深度优先搜索(DFS) 深度优先搜索就好比走迷宫, 不断顺着一条路走, 直到走不通为止, 然后回退到上一个路口再向另外的方向行走(走过的方向就不会再走了,又不是傻子, 知道走不通,还向走不通的方向走), 不断重复(试过所有路口, 状态转移), 重复直到找到唯一的一条合适的路径; DFS…

python 串口_如何使用Python开发串口通讯上位机(一)

用Python开发串口通讯型上位机&#xff0c;其实并非最优解&#xff0c;本系列更新只为个人学习与总结。如果有C语言底子&#xff0c;嵌入式层面的上位机开发&#xff0c;C Builder&#xff0c;C#才是更加好用的利器。1什么是上位机从事过嵌入式软件开发或者工控机开发的&#x…

算法题之求二叉树的最大距离

二叉树是一种非常经典的数据结构。如果我们把二叉树看成一个图&#xff0c;父子节点之间的连线看成是双向的&#xff0c;我们姑且定义"距离"为两节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。 下面我们随意构造出一棵二叉树&#xff0c…