JNI

Android:JNI 与 NDK到底是什么?(含实例教学)

[亡魂溺海] 提交于 2019-12-06 08:28:46
前言 在 Android 开发中,使用 NDK 开发的需求正逐渐增大 但很多人却搞不懂 JNI 与 NDK 到底是怎么回事 今天,我将先介绍 JNI 与 NDK & 之间的区别,手把手进行 NDK 的使用教学,希望你们会喜欢 目录 1. JNI介绍 1.1 简介 定义: Java Native Interface ,即 Java 本地接口 作用: 使得 Java 与 本地其他类型语言(如 C、C++ )交互 即在 Java 代码 里调用 C、C++ 等语言的代码 或 C、C++ 代码调用 Java 代码 特别注意: JNI 是 Java 调用 Native 语言的一种特性 JNI 是属于 Java 的,与 Android 无直接关系 1.2 为什么要有 JNI 背景:实际使用中, Java 需要与 本地代码 进行交互 问题:因为 Java 具备 跨平台 的特点,所以 Java 与 本地代码交互的能力非常弱 解决方案: 采用 JNI 特性 增强 Java 与 本地代码交互的能力 1.3 实现步骤 在 Java 中声明 Native 方法(即需要调用的本地方法) 编译上述 Java 源文件javac(得到 .class 文件) 通过 javah 命令导出 JNI 的头文件( .h 文件) 使用 Java 需要交互的本地代码 实现在 Java 中声明的 Native 方法 如 Java

JNI 技巧

狂风中的少年 提交于 2019-12-06 08:28:04
JNI 是指 Java 本地层接口(Java Native Interface)。它为用 Java 语言编写的受控代码定义了一种与本地层代码(用 C/C++ 编写)交互的方式。它是厂商无关的,其支持从动态共享库加载代码,尽管有时笨重,但它仍是有效的。 如果你对它还不熟悉,可以阅读 JNI规范(Java Native Interface Specification) 来获得对它的更多了解,了解 JNI 如何工作以及它有哪些功能。规范中有些地方的说明,并不是特别的清晰简洁明了,因而接下来的一些内容也许有点用。 JavaVM 和 JNIEnv JNI 定义了两个关键的数据结构, JavaVM 和 JNIEnv 。它们都是指向函数表的指针。(在 C++ 版本中,它们是类,其中包含一个指向函数表的指针,及每个 JNI 函数对应一个的成员函数,这些成员函数则简单地调用函数表中的对应函数。) JavaVM 提供了“调用接口”函数,通过这些函数,可以创建和销毁一个 JavaVM。看一下 JavaVM 结构的定义就一目了然了: # if defined(__cplusplus) typedef _JavaVM JavaVM; # else typedef const struct JNIInvokeInterface* JavaVM; # endif /* * JNI invocation

JNI教程与技术手册

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-06 08:27:41
转载请标明出处: http://blog.csdn.net/shensky711/article/details/52806794 本文出自: 【HansChen的博客】 概述 对于JNI,有些童鞋在没有接触过的时候,可能会觉得比较复杂,但是其实当你真正去了解、去使用的时候,就会发现JNI的使用还是比较简单的,JNI本身提供了一系列的API让我们可以在native方法中操作java。JNI的使用无非也就是使用这些接口和java交互。这几天在学习JNI接口的时候,发现网上搜索的JNI的中文虽然不少,但是很多都是零零碎碎的小例子,有一些官方文档的翻译,但要么是不全面,要么是资料比较旧了,干脆自己根据 java native interface specification 整理了一份技术资料。当然,很多时候看中文资料是词不达意的,如果文中有疑问的地方欢迎指出,或者翻阅原文 首先,JNI是一个本地编程接口。它允许运行在Java虚拟机的Java代码与用其他语言(如C,C++和汇编)编写的库交互 JNI最大的好处是JNI不受Java虚拟机实现方式的限制,因此,Java虚拟机厂商添加JNI的支持并不会影响虚拟机其它功能模块。native代码只需要编写一遍,就可以在所有支持JNI的虚拟机上工作。 通过JNI,你可以在native代码中: 创建、检查或者更新java对象 调用java方法

JNI学习笔记

杀马特。学长 韩版系。学妹 提交于 2019-12-06 08:25:27
1为什么使用JNI? JNI 的强大特性使我们在使用 JAVA 平台的同时,还可以重用原来的本地代码。作为虚拟机 实现的一部分,JNI 允许 JAVA 和本地代码间的双向交互。 请记住,一旦使用 JNI,JAVA 程序就丧失了 JAVA 平台的两个优点: 1、 程序不再跨平台。要想跨平台,必须在不同的系统环境下重新编译本地语言部分。 2、 程序不再是绝对安全的,本地代码的不当使用可能导致整个程序崩溃。 一个通用规则是,你应该让本地方法集中在少数几个类当中。这样就降低了 JAVA 和 C 之间的耦合性。 当你开始着手准备一个使用 JNI 的项目时,请确认是否还有替代方案。像上一节所提到的, 应用程序使用 JNI 会带来一些副作用。下面给出几个方案,可以避免使用 JNI 的时候,达到 与本地代码进行交互的效果: 1、JAVA 程序和本地程序使用 TCP/IP 或者 IPC 进行交互。 2、 当用 JAVA 程序连接本地数据库时,使用 JDBC 提供的 API。 3、JAVA 程序可以使用分布式对象技术,如 JAVAIDLAPI。 这些方案的共同点是,JAVA 和 C 处于不同的线程,或者不同的机器上。这样,当本地程序 崩溃时,不会影响到 JAVA 程序。 下面这些场合中,同一进程内 JNI 的使用无法避免: 1、 程序当中用到了 JAVA API 不提供的特殊系统环境才会有的特征

JNI 实战全面解析

倖福魔咒の 提交于 2019-12-06 08:22:51
简介 项目决定移植一款C++开源项目到 Android 平台,开始对JNI深入研究。 JNI是什么? JNI( Java Native Interface)意为 Java 本地调用,它允许Java代码和其他语言写的代码进行交互,简单的说,一种在Java虚拟机控制下执行代码的标准机制。 NDK是什么? Android NDK(Native Development Kit )是一套工具集合,允许你用像C/C++语言那样实现应用程序的一部分。 为什么要用NDK? 1、安全性,java是半解释型语言,很容易被反汇编后拿到源代码文件,我们可以在重要的交互功能使用 C语言 代替。 2、效率,C语言比起java来说效率要高出很多。 JNI和NDK的区别? 从工具上说,NDK其实多了一个把.so和.apk打包的工具,而JNI开发并没有打包,只是把.so文件放到文件系统的特定位置。 从编译库说 , NDK开发C/C++只能能使用NDK自带的有限的头文件,而使用JNI则可以使用文件系统中带的头文件。 从编写方式说, 它们 一样。 详解 1、JNI 元素 1、JNI组织结构 JNI函数表的组成就像C++的虚函数表,虚拟机可以运行多张函数表。 JNI接口指针仅在当前线程中起作用,指针不能从一个线程进入另一个线程,但可以在不同的线程中调用本地方法。 2、原始数据 Jobject 对象 引用类型 Java类型

用 NDK编译Graphite2

对着背影说爱祢 提交于 2019-12-06 06:42:17
Graphite is a "smart font" system developed specifically to handle the complexities of lesser-known languages of the world. 上面这段话是从Graphite的官网( http://scripts.sil.org/cms/scripts/page.php?site_id=projects&item_id=graphite_hom )上摘的对于这个Open Source library的功能的描述。它是一个类似于Harfbuzz的一个文本shape的引擎,只不过,它在shape的过程中,会更加依赖于font文件中提供的信息。对于缅甸语的处理, Graphite引擎 + Padauk font 文件的组合方案,堪称完美。 这个library用到的API也大多在standard C++的范围之内,这就给用NDK编译这个library创造了很好的条件。 在NDK中使用STL的方法,可以看到Google官方文档(prebuilts/ndk/7/sources/cxx-stl/gnu-libstdc++/README)中的一段话: This directory contains the headers and prebuilt binaries for the GNU

深入理解JAVA虚拟机原理之Dalvik虚拟机(三)

我的未来我决定 提交于 2019-12-05 22:38:58
更多Android高级架构进阶视频学习请点击: https://space.bilibili.com/474380680 本文是Android虚拟机系列文章的第三篇,专门介绍Andorid系统上曾经使用过的Dalvik虚拟机。 也许有人会问,既然Dalvik虚拟机都已经被废弃了,为什么我们还要了解它呢?出于下面的原因,让我觉得还是有必要了解一下Dalvik虚拟机的: Dalvik留下的很多机制在现在的Android系统是一样适用的,例如Dalvik指令,dex文件 并非每个人都是在最新版本的Android系统上工作 了解一项技术曾经的历史和演进过程,有助于增加对于现在状态的理解 Dalvik是Google专门为Android操作系统开发的虚拟机。它支持.dex(即“Dalvik Executable”)格式的Java应用程序的运行。.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。 Dalvik由Dan Bornstein编写,名字来源于他的祖先曾经居住过的小渔村达尔维克(Dalvík),位于冰岛。 栈 VS 寄存器 大多数虚拟机都是基于堆栈架构的,例如前面提到的HotSpot JVM。然而Dalvik虚拟机却恰好不是,它是基于寄存器架构的虚拟机。 对于基于栈的虚拟机来说,每一个运行时的线程,都有一个独立的栈。栈中记录了方法调用的历史

[Android] 图片JNI(C++\Java)高斯模糊 多线程

跟風遠走 提交于 2019-12-05 18:06:37
======================================================== 作者: qiujuer 博客: blog.csdn.net/qiujuer 网站: www.qiujuer.net 开源库: Genius-Android 转载请注明出处: http://blog.csdn.net/qiujuer/article/details/41777001 ======================================================== 在我的博客中,曾经发布了一篇 高斯模糊(堆栈模糊) 的文章;在其中使用了国外的一个 堆栈模糊 来实现对图片的模糊处理;同时弄了一个JNI C++ 的版本。 这篇文章依然是堆栈模糊;可以说最原始的地方还是堆栈模糊部分;只不过是支持多线程的。 纳尼?? 感情是之前那个不支持多线程?Sorry,我说错了;两个都是支持多线程调用的。不过新讲的这个是能在内部采用多线程进行 分段模糊 。 原来的: [Android]-图片JNI(C++\Java)高斯模糊的实现与比较 开工吧 说明:其中代码大部分来源于网络,不过都是开源的。 最原始的代码: stackblur.cpp // The Stack Blur Algorithm was invented by Mario Klingemann, /

安卓开发,在jni环境中获取手机外储存路径

别说谁变了你拦得住时间么 提交于 2019-12-05 17:45:31
jclass envClz = (*env)->FindClass(env, "android/os/Environment"); jmethodID getExternalStorageDirectory = (*env)->GetStaticMethodID(env, envClz, "getExternalStorageDirectory", "()Ljava/io/File;"); jobject jobject1 = (*env)->CallStaticObjectMethod(env, envClz, getExternalStorageDirectory); jmethodID getAbsolutePath = (*env)->GetMethodID(env, (*env)->FindClass(env, "java/io/File"), "getAbsolutePath", "()Ljava/lang/String;"); jstring jstring1 = (*env)->CallObjectMethod(env, jobject1, getAbsolutePath); const char *path_utf = (*env)->GetStringUTFChars(env, jstring1, NULL); LOGE("%s", path_utf); (

JNI

余生颓废 提交于 2019-12-05 11:36:02
2019-11-24 JNI读取文件: 首先要申请权限 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 然后,JNI的默认路径是/,根目录一般都是没有权限,你一般要用存储卡路径,比如我的手机是 /storage/emulated/0/new.txt 来源: https://www.cnblogs.com/angelshelter/p/11922737.html