-
JNI开发
2017-05-19 22:12:09最近在学习JNI开发的知识,现将相关的知识总结一下。文章将从JNI简介、JNI原理、JNI常见错误、JNI内存泄露、JNI开发环境搭建、JNI实践这几个部分来分享JNI开发的知识,每一个部分都会以单独的文章来描述。 上图是JNI...最近在学习JNI开发的知识,现将相关的知识总结一下。文章将从JNI简介、JNI原理、JNI常见错误、JNI内存泄露、JNI开发环境搭建、JNI实践这几个部分来分享JNI开发的知识,每一个部分都会以单独的文章来描述。
上图是JNI开发知识的一个总的概括,接下来的文章将分别介绍每一个部分。
参考文章链接:
http://blog.csdn.net/mr_raptor/article/details/30115113
http://www.tuicool.com/articles/YVbURfQ
-
JNI开发.rar
2020-04-16 10:25:14JNI开发 -
JNI开发步骤
2018-01-10 16:40:47JNI开发步骤,简单理解JNI开发以及详细步骤。。。。。。。 -
JNI 开发demo
2018-03-09 14:05:58JNI 开发JNI 使java方法能够调用c实现的一些函数,实现一些底层的操作,下面简单介绍JNI的开发步骤,实现一个简单的demo
1、配置NDK环境:
安装NDK:打开Tools->Android->SDK Manager->SDK Tools选中LLDB和NDK,点击确认,软件会自动安装NDK
安装好的NDK一般位于你的sdk文件夹下的ndk-bundle,然后将该路径追加到你系统变量的path里面去,如下:
;C:\Users\Administrator\AppData\Local\Android\Sdk\ndk-bundle -
JNI 开发资料
2021-03-18 16:33:00JNI Types and Data Structures Android Studio jni开发入门——看我就够了! JNI 与AIDL 简明概述 Android JNI使用全面讲解 JNI 常用函数大全 -
java jni开发_JNI开发系列①JNI概念及开发流程
2021-02-26 20:35:02我们最终的目的是要学会NDK开发 , 而NDK开发就离不开我们的JNI技术 。下面 , 就来开始我们的JNI之旅吧 。JNI的概念JNI全称 Java Native Interface , java本地化接口 , 可以通过JNI调用系统提供的API , 我们知道...引言
在学习了C语言基础之后 ,我们简单的了解了C语言编程的一些范式 , 了解了指针 , 结构体 , 联合体 , 函数 , 文件IO等等 。我们最终的目的是要学会NDK开发 , 而NDK开发就离不开我们的JNI技术 。下面 , 就来开始我们的JNI之旅吧 。
JNI的概念
JNI全称 Java Native Interface , java本地化接口 , 可以通过JNI调用系统提供的API , 我们知道 , 不管是linux还是windows亦或是mac os , 这些操作系统 , 都是依靠C/C++写出来的 , 还包括一些汇编语言写的底层硬件驱动 。java和C/C++不同 , 它不会直接编译成平台机器码,而是编译成虚拟机可以运行的java字节码的.class文件,通过JIT技术即时编译成本地机器码,所以有效率就比不上C/C++代码,JNI技术就解决了这一痛点,下面我们来看看JNI调用示意图:
JNI技术.png
从上图可以得知 ,JNI技术通过JVM调用到各个平台的API , 虽然JNI可以调用C/C++ , 但是JNI调用还是比C/C++编写的原生应用还是要慢一点 , 不过对高性能计算来说 , 这点算不得什么 , 享受它的便利 , 也要承担它的弊端 。
JNI开发流程
因为JNI开发并未涉及到NDK , 所有我们的开发工具是eclipse and visual studio 。
第一步:编写java本地方法
public static native String getStringFromC() ;
第二步:生成.h头文件 , 需要使用到的java命令是javah
# 假定你以配置好java环境
# 在控制台中进入工程src目录
> cd E:\java_workspace\Hello_JNI\src
> javah com.zeno.jni.HelloJni
# 需要注意的是 , com.zeno.jni.HelloJni , 是全类名, 包名.类名
第三步:将.h头文件复制到VS的代码文件目录下 , 在解决方案中的头文件目录-> 右键-> 添加 -> 添加现有项 。 将我们的头文件添加进来。
添加头文件.png
添加进来之后 , 打开我们的头文件 , 会发现 , 头文件里面的jni.h这个头文件找不到 , 因为它不是系统的头文件 , 所有我们需要将它找出来 , 并复制到我们的工程项目中 。
# JDK 的jni.h头文件目录
D:\Java\jdk1.8.0_60\include\jni.h
# 在jni.h头文件中,又引入了jni_md.h头文件 , 所有这个我们也要一并赋值过来
D:\Java\jdk1.8.0_60\include\win32\jni_md.h
将jni.h这个头文件按照上述步骤 , 添加到头文件目录中 , 注意将<>改成" " , <>表示引入的是系统头文件," "表示引入的是第三方头文件。
第四步:实现头文件
// 生成的头文件函数
/*
* Class: com_zeno_jni_HelloJni
* Method: getStringFormC
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_zeno_jni_HelloJni_getStringFromC
(JNIEnv *, jclass);
新建一个.c的文件 ,引入我们生成的头文件 ,然后实现我们生成的C语言函数。
/*
* Class: com_zeno_jni_HelloJni
* Method: getStringFormC
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_zeno_jni_HelloJni_getStringFromC
(JNIEnv *Env, jclass jclazz) {
return (*Env)->NewStringUTF(Env, "Jni C String");
}
第五步:生成动态链接库
补充:
库名称
特性
扩展名
动态库
1.动态库把对一些库函数的链接载入推迟到程序运行的时期。2.可以实现进程之间的资源共享。(因此动态库也称为共享库)3.可以动态注入到程序中
win(.dll)linux(.so)
静态库
1.静态库对函数库的链接是放在编译时期完成的。2.程序在运行时与函数库再无瓜葛,移植方便。3.浪费空间和资源,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件。
win(.lib)linux(.a)
了解了静态库和动态库 , 下面我们就来生成一个动态库,以VS为例:
选中项目 -> 右键 -> 属性 -> 常规 -> 项目默认值 -> 配置类型 , 选择动态库.dll
项目属性配置.png
配置完成之后 , 选中项目 -> 生成 。即可生成动态链接库。
动态链接库.png
第六步:配置环境变量
我们生成了.dll文件之后 , java环境并不知道有这个.dll动态链接库的存在 , 所有我们需要将生成.dll的文件目录 , 配置到环境变量中。
配置环境变量.png
注意:配置好环境变量 , 需要重新启动eclipse ,不然会找不到动态链接库的。
第七步:加载动态链接库
static{
System.loadLibrary("Hello_JNI") ;
}
第八步 : 调用本地方法并执行
/**
*
* @author Zeno
*
* JNI (Java Native Interface) java本地化接口
*
* Android Framework层与Native层相互通信的基石
*
*
*/
public class HelloJni {
// java调用C/C++函数的本地方法
public static native String getStringFromC() ;
public static void main(String[] args) {
System.out.println("getStringFormC == "+getStringFromC());
}
static{
// 加载动态库
System.loadLibrary("Hello_JNI") ;
}
}
输出:
getStringFormC == Jni C String
JNI 开发的步骤虽然多 , 但大多比较简单 , 操作起来不难 。
结语
这篇是JNI系列的开篇 , 总体来说比较简单 , 先将流程走顺了 , 后续的开发就会好很多 , 流程性的东西 , 需要多操作 , 就会形成固定的套路 。
-
Android JNI 开发
2019-08-19 10:35:52在 Android 中,同样支持 JNI 开发,通过 Android 提供的 NDK 工具,可快速构建 JNI 开发环境,并且可以快速整合到 Android 项目中。 JNI 编译出的 .so 文件具有较高的安全性,反编译难度高,在一些涉及到安全层面... -
JNI开发之JNI原理
2017-05-19 23:55:04在上一篇文章中对JNI简单介绍了,在这篇文章中将对JNI原理进行介绍。本篇文章将以JNI执行环境、JNI数据类型、JNI注册方式、JNI引用、JNI变量共享以及JNI调用方式来介绍... 在JNI开发中有两个比较重要与执行环境Runtim -
JNI 开发笔记
2016-04-10 17:55:12JNI开发笔记,包括如下几个知识点:1.JNI 开发笔记 - 基本概念 主要介绍JNI基本概念,Native code的应用场景和优缺点。JNI中重要的数据结构等。2. JNI 开发笔记 - 数据类型罗列JNI中的数据类型。3. JNI 开发笔记 - ... -
Android JNI开发
2019-12-09 17:34:30Android JNI开发 一、前期准备 1、首先下载配置android studio ndk,然后在android studio中配置ndk环境,如下图所示(setting-Android SDK-SDK Tools) -
Android studio JNI开发
2020-03-21 16:33:06这篇JNI开发使用与Android studio 3.0以后版本,使用cmake开发, 一 NDK 环境配置: *** Android studio 3.2.1(自己使用的版本) 1、studio中下载NDK。file->setting->Android SDK... -
Android之JNI开发入门
2017-04-28 10:48:46jni开发工具 jni helloworld - jni开发的步骤 jni开发中的常见错误 jni简便开发流程 Java向C传递一些基本的类型处理 C代码中向logcat输出内容 C代码回调java方法 c 开发JNI what 什么是JNI JNI java native ... -
JNI开发之JNI常见错误
2017-05-20 12:20:52在上一篇文章中对JNI原理进行了介绍,这篇文章将对JNI开发中的一些常见错误进行总结一下。 一、常见错误原因分析 在JNI开发中,经常会遇到各种各样的错误,这里总结一下: find Library returned null 原因... -
[Android jni开发系列(三)]AndroidStudio jni开发常见问题
2018-04-10 21:19:54前面总结过两种方式进行Android ndk开发,今天再介绍一种利用AndroidStudio进行...利用《[Android jni开发系列(二)]AndroidStudio移植eclipse NDK项目开发》中配置的javah命令,生成包含native方法java类j对应jni头... -
Android JNI开发深度学习
2020-11-03 11:11:25在基本了解JIN后,如您对JNI进阶学习感兴趣,请阅读本篇博文,帮助您进一步...该篇博文从JNI的原理、函数创建及规则、Java与C/C++互调操作、JNI开发的各细则进行详细说明分析,希望能帮助大家能够快速熟练JNI的开发。 -
JNI开发知识点大纲
2019-09-15 23:10:53对近期项目使用JNI开发进行总结,其中红色文字表示未完待续 JNI介绍 JNI开发环境搭建与调试 JNI基本使用 JNI数据类型 JNI提供的函数介绍 类和对象操作 字符串操作 JNI开发案例 封装常用的... -
安卓JNI开发总结
2017-09-18 14:13:10安卓jni开发 -
JNI开发之JNI内存泄露
2017-05-20 12:27:52在上篇文章中介绍了JNI开发中遇到的常见错误,这篇文章将描述JNI开发中内存泄露问题。在Java编程中,内存泄漏可以根据泄漏的内存位置划分为两种:一种是JVM中的Java Heap的内存泄漏。另外一种是JVM中的Native memory... -
android-JNI开发
2012-07-09 13:31:47一个简单的android JNI 开发范例. 可以做入门学习之用 -
Android -- JNI开发(静态注册)
2018-05-18 19:03:26近来研究了一下Android Studio JNI开发,写过几个JAVA调用C层的例子,网上百度了很多,发现好多例子现在都不适用,因此在这儿做一个简单的总结,分享给大家。 特别说明:由于AS 和 Gradle更新过快,导致网上以前... -
记录Android studio JNI开发的三种方式(推荐)
2021-01-05 01:37:48在Andorid Studio不支持JNI开发之前大家一般都是使用Eclipse开发JNI,各种配置让人觉得很蛋疼。从Andorid Studio支持JNI开发后,让我们开发JNI变的如此简单。 NDK 和 JNI介绍 JNI (Java Native Interface)是一套编程... -
intellijidea jni开发
2018-08-12 10:31:01本故事起源于学习一下 jni 开发,就顺便试试用这个,网上搜到的各种 jni 开发方法都有 .h 头文件,.cpp 文件,还要写 .mk 之类的文件,但是用了这个,发现有个 cmake 的方法,就试试了,顺便记录以下 过程 跟... -
使用JNI开发音频转码器
2013-12-04 13:12:28使用JNI开发音频转码器 -
Android studio 下 NDK Jni 开发 简单例子
2016-05-24 11:29:16Android studio 下 NDK Jni 开发 简单demo 谢谢 -
Android jni 开发详细流程
2019-06-05 14:26:57Android jni 开发流程文档简介开发目的开发步骤(一)新建一个android工程(二)新建Java包(三)生成native方法(四)native方法声明(五)native方法实现(六)Android.mk文件配置(1) App/build.gradel中的... -
JNI 开发与调试流程
2018-08-20 18:55:00JNI 开发与调试流程 JNI 开发与调试流程 AS上使用断点调试的两种方法 1. 直接Debug 2.用Attached方式 3. 崩溃点查找 AS查看程序性能 DDMS查看性能 不依赖AS的调试方法 1. 利用gdb 2. 利用adb查看日志 不依赖... -
JNI开发之环境搭建
2017-05-20 14:03:16在上篇文章中介绍了JNI内存泄露的一些场景,这篇文章将描述JNI开发环境的搭建。JNI开发的环境搭建将从NDK简介、NDK环境配置之Eclipse、NDK环境配置之Linux、NDK环境配置之Android Studio、NDK之Android.mk文件、... -
jni开发注意事项
2017-12-17 16:22:16jni开发,分三步: 第一写JNI类,注意包名和类名统一。 第二步生成CLASS类,直接用JAVAC,就可以生成JAVA类 第三步,退到工程的JAVA目录,用javah指令就可以生成头文件。同时把类拷贝到JAVA同级目录下。就可以生成...