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

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

Android studio JNI jni实例相关推荐

  1. 【走过巨坑】android studio对于jni调用及运行闪退无法加载库的问题解决方案

    [走过巨坑]android studio对于jni调用及运行闪退无法加载库的问题解决方案 参考文章: (1)[走过巨坑]android studio对于jni调用及运行闪退无法加载库的问题解决方案 ( ...

  2. Android Studio使用jni、so库

    Android Studio使用jni.so库 在Android Studio1.1之后,AS就已经支持jni和so库了,马上发布的1.3正式版,更是可以在clion环境下编译c.c++,更加方便的使 ...

  3. [安卓开发笔记二]android Studio通过jni调用C++代码

    [安卓开发笔记二]android Studio通过jni调用C++代码 16/12/11 更新 此博客基于安卓android studio 1.5所写,现在已经有了android studio2.2的 ...

  4. android studio生成Jni头文件 java10,java11删除了javah,改用javac直接用源码生成jni头文件。 java8是用javah

    android studio生成Jni头文件 鼠标放本地方法上去,点提示来创建. java10,java11及以上   生成jni头文件 java10,java11删除了javah.改用javac直接 ...

  5. Android studio 下 JNI 开发实例

    在AS中进行 NDK 开发之前,我们先来简单的介绍几个大家都容易搞懵的概念: 到底什么是JNI,什么是NDK? 何为"交叉编译"? 先看什么是 JNI?JNI 的全称就是 Java ...

  6. android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测...

    http://www.cnblogs.com/linguanh/p/4624768.html?utm_source=tuicool&utm_medium=referral http://blo ...

  7. android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!

    目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. ------------------------------------- ...

  8. android studio 单步调试jni,android studio实现Jni单步调试-标准配置教程

    本文主要介绍在android studio下实现jni单步调试时,所需要的配置及其步骤,这些也是本人经过几天折腾慢慢实现的,先提供给大家做参考: 1,配置是在mac下android studio实现的 ...

  9. android studio编译JNI问题ninja: fatal: couldn‘t open nul的解决

      这几天编译同文trime输入法时遇到一个没法解决的问题,到网上搜也没有答案难道没人遇到类似的问题.问题描述如下: D:\project\andriod\trime-develop\app\src\ ...

  10. Android NDK开发——Android studio使用JNI调用OpenCV处理图像

    前言 这里要演示的是使用Android studio 做APP开发,使用JNI与C++交互的demo. 一.创建工程 1.创建一个Native C++工程. 2.命令工程和指定交互语言. 3.指定C+ ...

最新文章

  1. Linux中LVM(逻辑卷管理)的使用
  2. 2.3 利用正规化解决过拟合问题-机器学习笔记-斯坦福吴恩达教授
  3. xshell下载mysql到本地文件_在Xshell中上传下载文件到本地(linux中从多次ssh登录的dbserver里面的文件夹)-Go语言中文社区...
  4. 监督学习和无监督学习_让半监督学习再次伟大!谷歌最新无监督数据增强研究,全面超越现有半监督学习方法...
  5. matplotlib(2)
  6. JAVA面试要点003_Mybatis中#和$的区别
  7. 计算机考研408每日一题 day157
  8. java设置环境变量jre_JRE环境变量配置图解
  9. 90-0004Web颜色标准【中英文颜色对照】
  10. 电脑插入耳机未识别的问题
  11. 德国互联网现状,缺人,4万元每月的收入,可以考虑移民了
  12. 你们公司有职业通路图吗
  13. C4.5(决策树预测)算法
  14. 优化:java递归实现笛卡尔积算法
  15. 密码学速查笔记(一)-- 分组对称加密
  16. 《算法第一步》出版啦!
  17. 8月清北学堂培训 Day4
  18. 证明DES解密算法实际上是DES加密算法的逆
  19. 【智能制造】李培根院士:2017-2018中国制造业及智能制造十大热点
  20. 汽车理论matlab编程,汽车理论课后作业matlab编程详解(带注释)

热门文章

  1. Permissions for id_rsa are too open
  2. ArrayList的使用方法【转载】
  3. linux shell 上传,下载ftp文件
  4. corosync+openais+pacemaker+web
  5. C++ 重载(overload)、重写(overrride)、重定义(redefine)总结
  6. 工作的习惯,看到好收藏下
  7. VC++ 6.0 与VS2008 C++ DEBUG工具(Windows)介绍
  8. Spring中都用到了哪些设计模式?
  9. dbc连接mysql_Spring WebFlux 使用 R2DBC 访问 MySQL
  10. html section 布局,section标签的用法