JNI

JNI

谁都会走 提交于 2019-12-06 08:34:33
用JNI实现 实例: 创建HelloWorld.java class HelloWorld { private native void print(); public staticvoid main(String[] args) { new HelloWorld().print(); } static { System.loadLibrary("HelloWorld"); } } 注意print方法的声明,关键字native表明该方法是一个原生代码实现的。另外注意static代码段的System.loadLibrary调用,这段代码表示在程序加载的时候,自动加载libHelloWorld.so库。 编译HelloWorld.java 在命令行中运行如下命令: javac HelloWorld.java 在当前文件夹编译生成HelloWorld.class。 生成HelloWorld.h 在命令行中运行如下命令: javah -jni HelloWorld 在当前文件夹中会生成HelloWorld.h。打开HelloWorld.h将会发现如下代码: /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class HelloWorld */ #ifndef

JNI使用

走远了吗. 提交于 2019-12-06 08:34:21
对于如何使用JNI的初衷是因为看jdk源码时看到有native关键字,由于对这个关键字很陌生,就查了下,原来是Java调用C/C++写的动态库文件时才使用到的,因此便学习了下,使用方法如下: native用法:用native修饰的方法表示,该方法的实现不是在当前文件,而是用其它语言(如:C/C++)实现,java语言不能对操作系统底层进行操作和访问,因此需要使用JNI接口调用 实现示例: package com.summary; public class JNITest { public native void hello(); static{ System.loadLibrary("JNITest"); } public static void main(String[] args){ new JNITest().hello(); // System.out.println(System.getProperty("java.library.path")); } } 编译: 1、先建立编译后文件存放目录:out/com/summary/, out和src目录同级,如下: --JNITest --src --com --summary JNITest.java --out --com --summary JNITest.class 2、cmd到JacobTest目录下,执行:

JNI基本使用

时光总嘲笑我的痴心妄想 提交于 2019-12-06 08:34:03
概述 从今天开始,准备研究一下JNI相关的开发,其实很早之前就想学习这方面的东西了,一个原因是平时开发中用的很少,就没研究,另外一个原因是因为其他方面的东西还是比较多的,所以没有时间来学习这部门内容。不过从今天起,为了向全面发展的道路上更迈进一步,开始学习JNI. 准备工作 开发JNI我们需要NDK这个东西?什么是NDK呢?简单给大家介绍一下,NDK是一系列工具的集合 NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。 NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。 NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。 首先我们去下载NDK,然后放在磁盘的某个路径下,这里我放在了 D: \develop \android -ndk-r10e 这是第一步,然后我们就可以在开发环境中进行配置了,很简单,只需要一句话,我们就可以开始JNI的编程了。具体做法如下,在当前项目的local.properties文件中添加你ndk的路径 # Location of the SDK. This is only used by Gradle. #

Java与c++通过JNI的完美结合

走远了吗. 提交于 2019-12-06 08:33:44
参看: 高煥堂 的课程《JNI:Java与C++的美好结合》 http://edu.csdn.net/course/detail/1469 参看: http://www.cnblogs.com/yejg1212/archive/2013/06/07/3125392.html 参看: http://blog.csdn.net/jiangwei0910410003/article/details/17465457 一、基本介绍 1、JNI是什么? Java本机接口(Java Native Interface (JNI))是本机编程接口,它是JDK的一部分,JNI它提供了若干的API,实现了和Java和其他通信(主要是C&C++)。 2、JNI有什么用? JNI最常见的两个应用:从Java程序调用C/C++,以及从C/C++程序调用Java代码。 3、使用JNI需要什么环境? (1)、JDK 工具及组件:(Java编译器:javac.exe 、JVM :java.exe 、本地方法C文件生成器:javah.exe) 库文件和头文件:jni.h( C头文件)、jvm.lib 和jvm.dll(windows下) 或libjvm.so(linux下)。 (2)、能够创建动态链接库的C和C++编译器 最常见的两个C编译器是用于Windows的Visual C++ 和用于基于UNIT系统的gcc

JNI的小总结

好久不见. 提交于 2019-12-06 08:33:30
code location dalvik/libnativehelper/include/nativehelper/jni.h frameworks/base/core/jni a ndroid的JNI的调用过程中有个很重要的地方就是参数映射。体现在一个叫 JNINativeMethod的 结构体里面 JNINativeMethod在jni中有定义。 typedef struct { const char* name; const char* signature; void* fnPtr; } JNINativeMethod; name对应java中的method name; signature是参数列表,由一串字符串表示,fnPtr是function pointer, 指向jni中的method。 最难理解的就是signature了,里面包含JAVA<——>C/C++之间的参数的map,即每个java类型,都有一个c/c++类型与之对应。 这些对应关系在 这段时间刚好看了蓝牙耳机部分,涉及到JNI调用,小小的总结一下。 JNI是JAVA Native Interface的缩写,意思是“JAVA 本地接口”。JNI帮助JAVA能和其它编程语言(C++ , C, 汇编)和库进行交互。 JNI的架构分为四个层次,应用程序---> JAVA框架(JAVA类(声明本地接口))--->

JNI学习之步步深入一

风流意气都作罢 提交于 2019-12-06 08:33:03
从接触Android的一段时间后,就经常听到JNI这个东东,刚开始,不知是由于对新事物的排斥,还是根本不把它当成一回事,就没有特地地去理他。只是在活跃的社区中零零散散地看到JNI的身影,大致知道所谓的JNI,就是一种不纯的JAVA编程技术,还需要把C/C++给扯进来。这下好了,看到需要C/C++,立马想到的是,有多远离多远。倒不是因为C/C++做过神马恐怖的勾当,而是本人C/C++技艺不精。自此,选择了逃避。 直到,面临毕业,稀里糊涂地投了一份应聘Android软件开发的岗位。当接到面试官的电话,问到“JNI是什么?”的时候,支支吾吾三言四语也说不出个你死我活。最后,面试的结果也是石沉大海,杳无音讯。从此,对JNI的讨厌之情,入骨三分,同时,又多了份感悟:JNI是个令人头痛,却又不得不学的东东。 就这样,找资料,看文档,一步步来,翻过了几座障碍,打通了Java到C的道路,那种喜悦,尽然让我哑然失笑。。。从此,觉得JNI不再那么邪恶。。。继续前行,,,后来发现,仅仅打通了道路,仅仅只能走个字符串,走个指令,想实现复杂的功能时,才知道,了解JNI的原理和规范刻不容缓,于是乎,Download一份英文JNI档案,不分昼夜地研磨,并在这里留下学习的脚印。。。 闲话少说,步入正文。 我们知道,Java应用程序是一处编码,处处运行的,之所以可以这么威风,靠的就是JVM这个东西,那什么是JVM呢

jni介绍

早过忘川 提交于 2019-12-06 08:30:36
JNI JNI 是 Java Native Interface 的缩写。从Java 1.1开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。 使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的,比如,使用一些旧的库,与硬件、 操作系统 进行交互,或者为了提高 程序 的性能。JNI标准至少保证本地代码能工作在任何Java 虚拟机实现下。 一、JNI(Java Native Interface)的设计目的 ·The standard Java class library may not support the platform-dependent features needed by your application. ·You may already have a library or application written in another programming language and you wish to make it accessible to Java applications ·You may want

Android下玩JNI的新老三种姿势

落爺英雄遲暮 提交于 2019-12-06 08:30:20
请尊重原创,转载请注明出处: http://blog.csdn.net/mabeijianxi/article/details/68525164 (本文已在 hongyang 微信公众号发布) 说明:本篇不撸代码,只玩编译,其包含了Android studio 2.2最新的JNI玩法 编译环境:macOS 10.12.3 工具包含:Android Studio 2.2 NDK-r14 在Android下要玩jni首先下载ndk是必须的,可以直接去 https://developer.android.google.cn/ndk/downloads/index.html 下载,当然我们家AS为开发者也提供了便捷 只需如图勾选然后OK即可,我的版本是r14,值得一提的是 google ndk-build 命令在 r13 后默认使用 Clang ,并将在后续版本中移除 GCC ,其编译速度更快、编译产出更小、出错提示更友好。 一、徒手编写Android.mk然后ndk-build编译: 这种编译其实是用make工具来玩的,在 linux 徒手写并编译过c的应该很清楚,通过编写makefile,然后再用make编译已经比不停的用gcc命令逐个编译要爽很多,但是 makefile 的编写还是有点蛋疼。程序员都是化繁为简善解人意的,通过 ndk 工具我们无需自己写 makefile 了

Android JNI作用及其详解

隐身守侯 提交于 2019-12-06 08:29:41
Java Native Interface (JNI)标准是Java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 Java 代码能够与用其它编程语言(如 C、C++ 和汇编语言)编写的应用程序和库进行交互操作。   1.从如何载入.so档案谈起   由于Android的应用层的类都是以Java写的,这些Java类编译为Dex型式的Bytecode之后,必须靠Dalvik虚拟机(VM: Virtual Machine)来执行。VM在Android平台里,扮演很重要的角色。   此外,在执行Java类的过程中,如果Java类需要与C组件沟通时,VM就会去载入C组件,然后让Java的函数顺利地调用到C组件的函数。此时,VM扮演着桥梁的角色,让Java与C组件能通过标准的JNI介面而相互沟通。   应用层的Java类是在虚拟机(VM: Vitual Machine)上执行的,而C件不是在VM上执行,那么Java程式又如何要求VM去载入(Load)所指定的C组件呢? 可使用下述指令:   System.loadLibrary(*.so的档案名);   例如,Android框架里所提供的MediaPlayer.java类,含指令:   public class MediaPlayer{   static {

Android JNI基础篇(一)

拥有回忆 提交于 2019-12-06 08:29:11
Android JNI 基础篇 前言 JNI学习其实并不难,在这里,我将引导大家学习JNI的基础知识,认真学完本教程,你将更加坚信我说的话。来吧,我们一起学习! JNI 基础 JNI 是什么? JNI的全称就是Java Native Interface,顾名思义,就是Java和C/C++相互通信的接口,就好比买卖房子都需要找中介一样,这里的JNI就是Java和C/C++通信的中介,一个中间人。 JNI 头文件 JNI开发前提是要引入jni.h头文件,这个文件Android NDK目录下面 示例如下: #include<jni.h> 怎么加载 so 库? Android提供了3个实用的函数用来加载JNI库,分别是System.loadLibrary(libname),Runtime.getRuntime().loadLibrary(libname),以及Runtime.getRuntime().load(libFilePath)。 用 loadLibrary 函数加载 用System.loadLibrary(libname)和Runtime.getRuntime().loadLibrary(libname)这两个函数加载so库,不需要指定so库的路径,Android会默认从系统的共享库目录里面去查找,Android的共享库目录就是vendor/lib和system/lib