JAVA JNI学习

JAVA JNI

 

JNI是Java Native Interface的缩写,中文为JAVA本地调用。从Java1.1开始,Java Native Interface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。

设计目的

标准的java类库可能不支持你的程序所需的特性。 JNI

或许你已经有了一个用其他语言写成的库或程序,而你希望在java程序中使用它。

你可能需要用底层语言实现一个小型的时间敏感代码,比如汇编,然后在你的java程序中调用这些功能

 

JNI步骤:

 

1、   编写JAVA程序

Public class JniTest{

        native int add(int a , int b);

        //所有native关键词修饰的都是对本地的声明

        Static {

           System.loadLibrary(“add”);

           //加载动态库(libadd.so)

}

public static void main(String [] args){

      System.out.println(“start java app”);

      JniTest jniTest = new JniTest();

      int ret;

      ret = jniTest.add(4,6);

      System.out.println(“jni test result is: ” + ret);

 

}

}

 

2、   编译JAVA程序

javac JniTest.java

javah  -jni JniTest会生成JniTest.h如下

把JniTest.h改成add.c(mv JniTest.h  add.c)并把文件必修如下

2.1JNI函数命名规则

   Java(固定)_<包名,如com_android_xxx>_<类名>_<函数名>

   Java_JniTest_add

   固定 类名  函数名 (例中没有对JAVA进行打包)

3、   编译动态库

gcc –fPIC –c add.c –o add.o

在编译过程中会出现jni.h等文件找不到,所以用绝对路径指定头文件:在add.c修改如下

在jni.h修改如下

 

gcc –shared  add.o  –o libadd.so

//生成libadd.so动态库

4、   执行JAVA程序

LD_LIBRAY_PATH=.  java JniTest

//为程序增加从当前目录加载动态库

执行结果:

start java app

jni test result is: 10

 

 

总结:在过程中注意所包含的头文件是哪里的,jni.h是java(编译器)提供的,所以在<JAVA_HOME>/include/;通常我们写的linux程序的头文件是在/usr/include/下(gcc提供)

OK,完毕!!!!!!!!!!!!

 

时间: 2024-10-11 11:18:27

JAVA JNI学习的相关文章

JNI学习之Invocation API

本文是对链接http://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/invocation.html的学习笔记,限于英文水平和对JNI的理解,可能存在错误. 简介 通过使用Invocation API,使用C/C++开发的本地应用可以访问Java虚拟机提供的特性.为了描述简单,下面提到的VM指的都是Java虚拟机. 创建VM 在本地应用里,调用JNI_CreateJavaVM()方法可以完成初始化.加载VM,并返回指向新VM对象

【转】JNI学习积累之一 ---- 常用函数大全

原文网址:http://blog.csdn.net/qinjuning/article/details/7595104 本文原创,转载请注明出处:http://blog.csdn.net/qinjuning 最近一段时间,在工作方面比较闲,分配的Bug不是很多,于是好好利用这段时间就着源代码看了些许模块, 主要方式 还是贼看贼看代码, 同时利用烧机的便利,加Log观看,基本上都能弄个脸熟 .心里想着该写点什么了?可是水平不够,再加上 包括很多真正实现地方--中间层,基本上没看.于是乎,也就不好卖

关于java jni编译javac javah的问题

这篇文章是在安卓教程网http://android.662p.com那边分享过来的,文章说得还不错的,希望能够帮到大家的学习. javac  编译class文件命令,需要注意的是当类B中import类A时,在编译B时要包含A的路径,如 project  src  com.jl.test  A.java com.jl.test2 B.java B中importA,在编译B时应该  : javac  -cp ~/project/src  B.java       (-cp :classpath简称,

[转载]JNI学习积累之一 ---- 常用函数大全

本文转载于:http://blog.csdn.net/qinjuning 最近一段时间,在工作方面比较闲,分配的Bug不是很多,于是好好利用这段时间就着源代码看了些许模块, 主要方式 还是贼看贼看代码, 同时利用烧机的便利,加Log观看,基本上都能弄个脸熟 .心里想着该写点什么了?可是水平不够,再加上 包括很多真正实现地方--中间层,基本上没看.于是乎,也就不好卖弄了. 花了几天时间研究了下JNI,基本上知道如何使用了.照我的观点JNI还是不难的,难得只是我们一份尝试的心. 学习过程中, 发现关

JNI学习心得(1)

最近由于公司需求,开发Android项目,之前没接触过,了解甚少. Android驱动层的开发流程(个人理解):(自上而下)Android APP =>JNI => HAL => Linux devices Read/Write 据我了解,大致流程就是这样,如有不对,欢迎大礼拍砖. 由于驱动层一般由C/C++开发.需要与JAVA交互需要通过JNI. JNI负责JAVA与其他语言(C/C++)进行交互.类似于windows平台下,不同语言之间用.dll封装,进行交互. JNI最终会生成 .

JAVA native 学习 [持续更新]

最近查看ZipFile的源码,发现了native声明,学习一下,下面是整理的一些资料. java native方法及JNI实例 http://blog.csdn.net/xw13106209/article/details/6989415 JNI学习笔记(七)——异常处理 http://blog.csdn.net/ljeagle/article/details/6728930

Android(java)学习笔记160:Framework运行环境之启动Zygote

前面Android(java)学习笔记159提到Dalvik虚拟机启动初始化过程,就下来就是启动zygote进程: zygote进程是所有APK应用进程的父进程:每当执行一个Android应用程序,Zygote就会孵化一个子线程去执行该应用程序(系统内部执行dvz指令完成的)  Å特别注意:系统提供了一个app_process进程,它会自动启动ZygoteInit.java和SystemServer.java这两个类,app_process进程本质上是使用dalvikvm启动ZygoteInit

java初步学习hello word

java初步学习hello word 发表于 2012-08-16 08:05:12 by 月小升 1.下载 java JDKhttp://www.oracle.com/technetwork/java/javase/downloads/index.html 2.安装 JDK 3.打开命令行 输入 java 按下 Enter 你会看到 Usage: java [-options] class [args...] (to execute a class) or java [-options] -j

Java基础学习——数组初识(1)

Java基础学习--数组初识(1) 1什么是数组 Java中常见的一种数据结构就是数组,数组可以分为一维数组.二维数组和多维数组. 数组是由一组相同的变量组成的数据类型,数组中每个元素具有相同的数据类型,数组中的每个元素都可以用一个统一的数组名和下标来确定. 2 数组的使用 数组的一般使用步骤: 声明数组 分配内存给该数组 下面是一维数组为例: 数据类型  数组名 []: 数组名 = new 数据类型 [数据个数]: 2.1一维数组的声明与赋值 1.数组的声明 int  num [];