JNI

Mac OS X中的JNI调用和实现

回眸只為那壹抹淺笑 提交于 2020-01-07 07:45:29
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 网上给出的在Windows和Linux操作系统下的JNI编程教程很多,其实无论在哪个系统中都是相似的步骤。总结如下: 编写Java程序文件,要使用调用本地库的类需在static初始化块内使用System.loadLibrary("库名")方法加载。 编译该Java类获得.class文件,并且使用javah -jni 类名获取“类名.h”头文件。 包含该头文件并实现头文件中声明的方法。 编译并生成本地库文件。 将该库文件放置于java.library.path路径(可以通过System.getProperties().get(" java.library.path ")查看该路径)下,即可正常使用该Java类。 唯一不同的处在于本地库文件的编译方式不同。 Windows中,一般使用VisualStudio IDE生成"库名.dll"动态链接库文件。(注意:库文件的命名方式及其重要!) Linux中使用gcc进行编译。一般要使用-I选项包含$JAVA_HOME/include和$JAVA_HOME/include/linux,并使用-fPIC -shared -o lib库名.so生成动态链接库文件。 而在Mac OS X中,采用和Linux和有相似的做法。但是我尝试后发现,无论我将该库文件放置于何处

Android Framework 分析

喜夏-厌秋 提交于 2020-01-04 05:36:34
Android Framework 分析 (一) 目录树 /framework/base/api /framework/base/awt /framework/base/build /framework/base/camera 关于 camera 的 HAL 接口库。最终生成 native 共享库 libcamera.so , 编译时根据是否定义 USE_CAMERA_STUB 来决定系统是否有 Camera 硬件支持。若没有实际的 Camera 硬件,则编译时会和虚拟 camera 静态库( libcamerastub.a, 由 camerahardwarestub.cpp,fakecamera 生成)链接生成 libcamera.so 。 /framework/base/cmds 关于 android 系统启动时用到的 command 等 /framework/base/cmds/am /framework/base/cmds/app_process 可执行文件 app_process ,该文件可以根据输入参数决定是 Zygote 启动(参考 init.rc 中的语句 service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server ) . 该执行程式会链接

android ART hook

喜欢而已 提交于 2020-01-04 05:36:12
0x00 前言 之前一直都是在Dalvik 虚拟机上在折腾,从Android 4.4开始开始引入ART,到5.0已经成为默认选择。而且最近看到阿里开源的 Dexposed 框架,已经提供了对于android art 模式下的 hook 支持,所以对照着android art 部分的源码和之前 liang 大牛放出了hook代码研究了一下ART模式下的hook原理,做个简单的整理。关于android ART 更详尽的部分 可以阅读csdn的博客专栏《老罗的android之旅》。 Android运行时ART执行类方法的过程分析 Android运行时ART加载类和方法的过程分析 Android运行时ART加载OAT文件的过程分析 0x01 ART ART是Android平台上的新一代运行时,用来代替dalvik。它主要采用了AOT(Ahead Of Time)的方法,在apk安装的时候将dalvikbytecode一次性编译成arm本地指令(但是这种AOT与c语言等还是有本质不同的,还是需要虚拟机的环境支持),这样在运行的时候就无需进行任何解释或编译便可直接执行。因为Dalvik执行的是Dex字节码,通过解释器执行。虽然Dalvik也会对频繁执行的代码进行jIT生成本地机器指令来执行,但毕竟在应用程序运行过程中将Dex字节码翻译成本地机器指令也会影响到应用程序本身的执行

JAVA中native方法调用

可紊 提交于 2020-01-03 02:42:48
在 Java 中native是关键字。它一般在本地声明,异地用C和C++来实现。它的声明有几点要注意:1)native与访问控制符前后的关系不受限制。2)必须在返回类型之前。3)它一般为非抽象类方法。4)native方法在异地实现,象抽象方法一样,所以没有方法体,以分号结束。如下列5种声明: native public void f(); 正确。 private native void f(); 正确。 protected int native f(); 错误,返回类型位置不对,返回类型必须在native之后。 public abstract native void f(); native必然不是abstract的。 native int f(){} 错误,因为存在方法体{} public static native f(); 正确。static与native方法位置随意。 下例是比较典型的native的使用方式,用loadLibrary导入存在源文件目录下的*.dll文件,然后定义native方法时,与c/c++实现的函数有相同的参数和返回类型。 view plain copy to clipboard public class OpticalFlowCalculateDll{ static{ System.loadLibrary( "OpticalFlow"); }

使用JNI进行Java与C/C++语言混合编程(1)--在Java中调用C/C++本地库

可紊 提交于 2020-01-03 02:42:34
JNI系列文章索引 使用JNI进行Java与C/C++语言混合编程(1)--在Java中调用C/C++本地库 使用JNI进行Java与C/C++语言混合编程(2)--在C/C++中调用Java代码 在Spark中使用JNI调用C/C++代码 JNI是Java Native Interface的英文缩写, 中文翻译为本地调用, 自从Java 1.1开始就成为了Java标准的一部分. C/C++是系统级的编程语言, 可以用来开发任何和系统相关的程序和类库, 但是Java本身编写底层的应用比较难实现, 使用JNI可以调用现有的本地库, 极大地灵活了Java的开发. C/C++的效率是目前最好的语言, 可以使用C/C++来实现一些实时性非常高的部分. C/C++和Java本身都是非常流行的编程语言, 一些大型软件中经常使用语言之间的混合编程. 鉴于目前网络上JNI的文章不是特别多, 我将自己的一些总结写在这里. 如有错漏, 欢迎指正! Java调用C/C++大概有这样几个步骤 编写带有native方法的Java类, 使用javac工具编译Java类 使用javah来生成与native方法对应的头文件 实现相应的头文件, 并编译为动态链接库(windows下是.dll, linux下是.so) 下面就完整的介绍一个简单的Java调用C/C++的例子, 这个例子是来自 http://www

自己实现一个Native方法的调用

余生颓废 提交于 2020-01-03 02:42:18
JNI 开始本篇的内容之前,首先要讲一下JNI。Java很好,使用的人很多、应用极 广,但是Java不是完美的。Java的不足体现在运行速度要比传统的C++慢上许多之外,还有Java无法直接访问到操作系统底层如硬件系统,为此 Java提供了JNI来实现对于底层的访问。JNI,Java Native Interface,它是Java的SDK一部分,JNI允许Java代码使用以其他语言编写的代码和代码库,本地程序中的函数也可以调用Java层的函 数,即JNI实现了Java和本地代码间的双向交互。 Native JDK开放给用户的源码中随处可见Native方法,被Native关键字声明的方法说明该方法不是以Java语言实现的,而是以本地语言实现的,Java可以直接拿来用。这里有一个概念,就是本地语言,本地语言这四个字,个人理解应该就是 可以和操作系统直接交互的语言。 通过JNI调用C++写的代码 下面演示一下如何写一段简单的C++代码,在Java中用一个Native方法去调用的步骤。C++代码使用到的IDE是Microsoft Visual Studio 2010,这是一款市面上开发C++代码最常用的IDE,功能强大。OK,接下来一步一步演示一下: 1、写一段Java代码。由于我们在Windows环境下,所以用的是一 个.dll文件,如果在Linux环境下的话,用的是一个.so文件

java代码通过JNI调用c函数

拈花ヽ惹草 提交于 2019-12-30 15:23:07
java代码通过JNI调用c函数 一. 总览 在Java代码中通过JNI调用C函数的步骤如下: 第一步:编写java代码 :在Java类中声明本地方法 第二步:编译java代码 :javac HelloJNI.java 生成 HelloJNI.class 第三步:生成C语言头文件 :使用javah命令,生成饱含JNI本地函数原型的头文件 第四步:编写C代码 :实现JNI本地函数 第五步:生成共享库 :生成C共享库 第六步:运行java程序 :通过JNI,调用JNI本地函数 二. 步骤 第一步:编写java代码: class HelloJNI { /* 本地方法声明 */ native void printHello ( ) ; native void printString ( ) ; /* 加载库 libhellojni.so*/ static { System . loadLibrary ( "hellojni" ) ; } public static void main ( String args [ ] ) { HelloJNI myJNI = new HelloJNI ( ) ; /* 调用本地方法(实际调用的是使用C语言编写的JNI本地函数) */ myJNI . printHello ( ) ; myJNI . printString ( "Hello World

Java调用动态链接库

浪子不回头ぞ 提交于 2019-12-26 20:30:29
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> Java调用动态链接库 JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决JAVA对本地操作的一种方法就是JNI。 JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法。 1、 编写Java源文件-JavaCall.java 在MY_PATH目录下新建JavaCall.java文件,设置文件编码格式为UTF-8。文件内容,首先知名从java.library.path下指明将要调用的动态库的名字,其次声明将要调用的方法。 2、 编译Java源文件-JavaCall.class cd MY_PATH javac JavaCall.java 此时将在该目录下生成JavaCall.class文件 3、 生成JNI头文件-java*.h javah JavaCall 此时将在该目录下生成JavaCall.h文件,其内容如下图所示。 4、 编写C源文件-CallJNI.c 在MY_PATH目录下新建CallJNI.c文件,在该文件中编写相关函数实现上一步JavaCall

Android JNI和NDK关系

ぐ巨炮叔叔 提交于 2019-12-26 14:12:05
1、什么JNI Java Native Interface(JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI 是本地编程接口,它使得在 Java 虚拟机(VM) 内部运行的 Java 代码能够与用其它编程语言(如 C、C++ 和汇编语言)编写的应用程序和库进行交互操作。 上面过程分为2个部分: 第一、用C语言生成一个库文件。 第二、在java中调用这个库文件的函数。 2、NDK NDK全称:Native Development Kit。 NDK是一系列工具的集合。 * NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。 * NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。 * NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。 个人理解,NDK就是能够方便快捷开发.so文件的工具。 JNI的过程比较复杂,生成.so需要大量操作,而NDK就是简化了这个过程。 3、java中调用.so文件代码 其中,在java中加载库文件的代码如下: System.loadLibrary(*.so的档案名); 例如

Java基础知识——JNI入门介绍

谁都会走 提交于 2019-12-22 18:02:07
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> Java类型和本地类型对应     在如下情况下,需 要在本地方法中应用java对象的引用,就会用到类型之间的转换:   1)java方法里面将参数传入本地方法;   2)在本地方法里面创建java对象;   3)在本地方法里面return结果给java程序。   分为如下两种情况:   Java原始类型   像 booleans、integers、floats等从Java程序中传到本地方法中的原始类型可以直接使用,下面是java中的原始类型和本地方法中的 类型的对应:   Java类型  本地类型  字节(bit)   boolean    jboolean   8, unsigned   byte    jbyte    8   char    jchar    16, unsigned   short    jshort    16   int     jint     32   long    jlong    64   float    jfloat    32   double   jdouble   64   void    void     n/a   也就是说如果我在方法中传进去了一个boolean的参数的话,那么我在本地方法中就有jboolean类型与之对应。同理,如果在本