`
liuhun3083053
  • 浏览: 17060 次
社区版块
存档分类
最新评论

jni入门

jni 
阅读更多
 JNI:Java Native Interface,是Java语言提供的一种通用接口,用于Java代码与本地化代码的交互。所谓本地化代码是指直接编译成的与机器相关的二进制代码,而非Java字节码之类的中间代码。Windows下面的可执行文件,DLL等,Linux下面的可执行文件和SO文件等,都是二进制代码。JNI允许Java语言编写的程序与其他语言编写的程序库(DLL, SO)或可执行文件进行互操作,包括汇编、C、C++。


JNI的开发步骤
  (1)、编写带有native方法的java类
  (2)、使用javac命令编译所编写的java类
  (3)、使用javah命令处理类文件,生成C/C++头文件
  (4)、使用C/C++实现本地方法
  (5)、将C/C++编写的文件生成动态连接库

一、建立java文件
public class testdll {
static{
  System.loadLibrary("goodluck"); //goodluck不用加文件类型
}
public native int getValue();//声明本地方法
public native void setValue(int i);

/**
  * @param args
  */
public static void main(String[] args) {
  testdll test=new testdll();
  test.setValue(10);
  System.out.println(test.getValue()); 
}
}
说明:
1)    在JAVA程序中,首先需要在类中声明所调用的库名称System.loadLibrary( String libname );,在库的搜寻路径中定位这个库。定位库的具体操作依赖于操作系统。在windows下,首先从当前目录查找,然后再搜寻”PATH”环境变量列出的目录。如果找不到该库,则会抛出UnsatisfiedLinkError。
2)      这里加载的是JNI生成的DLL,而不是其他生成的DLL的名称。?在这里,库的扩展名字可以不用写出来,究竟是DLL还是SO,由系统自己判断。
3)       还需要对将要调用的方法做本地声明,关键字为native。并且只需要声明,而不需要具体实现。?实现放在C中实现,稍后将做说明。
4)       如果加了static,表明是静态方法。如果不加,表明是一般的方法。加与不加,生成的头文件中有一个参数不同。


二、生成头文件
javac testdll.java  ----生成 testdll.class                
javah testdll       ----生成 testdll.h 头文件   
               
三、建立c文件
打开c编译器,建立一个dll空工程,把testdll.h导入工程中,新建一个test.cpp源文件
在testdll.h,发现里面有两个方法:
/*
* Class:     testdll
* Method:    getValue
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_testdll_getValue
  (JNIEnv *, jobject);

/*
* Class:     testdll
* Method:    setValue
* Signature: (I)V
*/
JNIEXPORT jint JNICALL Java_testdll_getValue
  (JNIEnv *, jobject);

JNIEXPORT不用管,第二个单词jint/void是返回值,jint相当于int类型,JNICALL不用管,每一个方法名前都有前缀Java_testll_,前两个参数JNIEnv *和jobject不用管,第二个方法的第三个参数jint就是java文件里的int i。
上面有声明了,现在就要实现这两个方法,编写testdll.cpp文件:

#include "testdll.h"
int i=0;
JNIEXPORT jint JNICALL Java_testdll_getValue
(JNIEnv *, jobject){
return i;
}
JNIEXPORT void JNICALL Java_testdll_setValue
(JNIEnv *, jobject, jint j){
i=j;
}

四、生成动态链接库文件
此时编译会出现error,主要是提示找不到jni.h(这个包含在testdll.h)里,需要我们把jni.h、jni_md.h复制到C:\Program Files\Microsoft Visual Studio\VC98\Include这个目录里(默认安装目录,如果安装VC不是这个目录,请自行找到Include目录)。

在构建之前先作如下操作:
把jni.h、jni_md.h复制到c文件编译器安装目录的Include这个文件夹里,其中ni.h、jni_md.h文件到下面目录去找:
jni.h------------------jdk安装目录\include
jni_md.h------------jdk安装目录\include\win32
然后再编译,构建,就有了test.dll这个动态链接库文件了,把它重命名成goodluck.dll。

五、运行
有两种方法运行:
1. 将goodluck.dll文件复制到testdll.class同目录下  在控制台输入:java testdll
如果goodluck.dll文件位置没放好就会报如下错误

2. 将goodluck.dll文件复制到eclipse中项目名目录下,运行
如果goodluck.dll文件位置没放好就会报如下错误


当goodluck.dll文件位置放正确之后运行程序之后将会得到正确答案:
10
但是。。。
你会郁闷的发现,报错了!!!

不用慌,我们还需要改动几个地方:
将testdll.h 和 testdll.cpp中的两个方法:

JNIEXPORT jint JNICALL Java_testdll_getValue

JNIEXPORT jint JNICALL Java_testdll_getValue

都改为:
JNIEXPORT jint JNICALL  _Java_testdll_getValue

JNIEXPORT jint JNICALL  _Java_testdll_getValue

即在java前加上”_”
 



0
0
分享到:
评论

相关推荐

    JNI入门Demo3.0

    通过这个"JNI入门Demo3.0",我们可以深入理解动态注册Native函数的概念和实现,从而在实际项目中更灵活地使用JNI。需要注意的是,动态注册虽然方便,但也需要谨慎处理,因为它可能会引入运行时错误,如方法签名不...

    JNI入门之HelloWorld(一)

    ### JNI入门之HelloWorld(一)详解 #### 一、引言 JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码与其他语言写的代码进行交互。JNI接口提供了若干公共服务,并为Java虚拟机和本机应用程序或...

    JNI入门知识介绍

    JNI(Java native interface)入门知识

    JNI入门教程之HelloWorld篇(详细版).doc

    ### JNI入门教程详解:HelloWorld篇 #### 一、引言与背景 Java Native Interface (JNI) 是Java语言与本地代码交互的桥梁,允许Java应用调用C或C++等本地语言编写的代码,这对于扩展Java功能、提高性能或集成已有非...

    JNI入门教程之HelloWorld篇

    总结来说,JNI入门教程之HelloWorld篇主要涵盖了以下知识点: 1. JNI的概念和作用,即Java与C/C++代码的交互。 2. 如何在Java中声明本地方法并定义相关数据结构。 3. 使用`javah`工具生成C/C++头文件。 4. C/C++中...

    JNI 入门初级教程

    ### JNI入门初级教程知识点概述 本教程旨在为初学者提供JNI(Java Native Interface)的基础知识与实践指导。JNI是Java平台的一部分,它允许Java代码与其他语言编写的代码进行交互,尤其是C和C++。这对于利用现有C...

    Android JNI入门Demo

    这个"Android JNI入门Demo"是一个适合初学者了解和学习JNI基础操作的实践项目。 在Android开发中,JNI的应用场景广泛,例如:提升性能的关键算法实现、调用系统库、访问硬件设备、游戏开发中的图形渲染等。下面将...

    JNI入门Demo1.0

    通过学习和实践这个JNI入门Demo1.0,你可以掌握JNI的基本用法,包括声明`native`方法、生成头文件、编写C++代码以及构建和加载动态库。这将为你进一步探索Android的原生开发打下基础,比如使用C++提升性能、接入第三...

    JNI入门Demo2.0

    本教程"JNI入门Demo2.0"将带你深入理解JNI的使用,特别是如何通过JNI反调用Java方法。 1. **JNI基础知识**: - JNI接口定义了Java虚拟机(JVM)和本地代码之间的通信规范,包括函数调用、数据类型转换、异常处理等...

    Android下JNI入门详解

    ### Android下JNI入门详解 #### 一、JNI与VM简介 JNI(Java Native Interface)作为Android平台上连接Java层与C/C++层的关键桥梁,在开发过程中起着至关重要的作用。通过JNI,开发人员能够实现Java与C/C++代码之间...

    JNI入门教程之HelloWorld篇.doc

    这篇“JNI入门教程之HelloWorld篇”文档将引导我们了解如何使用JNI来开发一个简单的应用程序。 首先,我们需要明白JNI的核心概念:本地方法接口。它提供了一种方式,让Java虚拟机(JVM)能够调用非Java语言编写的...

    NDK基础之JNI入门案例

    本教程将通过一个基础的JNI入门案例来介绍如何在Android应用中使用NDK和JNI。 首先,我们需要了解JNI的基本结构。JNI主要包含以下几个部分: 1. **本地方法声明**:在Java代码中,我们需要声明一个本地方法,这个...

    JNI入门与编程实现.zip

    JNI入门与编程实现

    JNI入门demo

    Java Native Interface的入门级学习demo,完美的解决了java.library.path中找不到动态库的问题,并解决了windows和linxu的兼容问题,使得这个项目打包成jar包后,能够直接在windows或Linux的java代码中调用

    JNI入门 pdf

    ### JNI入门知识点详解 #### 一、JNI简介与应用场景 JNI (Java Native Interface) 是 Java 平台标准的一部分,它允许 Java 代码和其他语言写的代码进行交互。JNI 主要用于以下场景: - **性能优化**:某些算法或...

    Android Studio JNI开发入门教程

    Android Studio的JNI(Java Native Interface)开发入门教程 JNI,全称为Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在Android开发中扮演着重要角色,尤其当...

    jni入门demo。java调c,c调java

    本教程将带你入门JNI,了解如何在Java中调用C代码,以及C代码如何回调Java。 首先,我们要创建一个Java类,声明一些本地方法(native methods)。本地方法是Java方法,但其实现是在C或C++中完成的。例如: ```java...

    JNI入门

    JNI,即Java Native Interface,是Java平台的一部分,自Java 1.1开始引入,它的主要目的是为了让Java代码能够与用其他编程语言(如C和C++)编写的本地代码进行交互。虽然这种交互可能导致平台可移植性的降低,但在...

Global site tag (gtag.js) - Google Analytics