`
laurence_cao
  • 浏览: 4808 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

JNI不完全指南

阅读更多

JNI不完全指南

1.      概述

JNI做为对JVM的补充,可以完成一些游离于JVM之外的代码,完成一些OS严重依赖的功能,比如你想自己实现基于IMCPping(如果问为什么,那么请重新学习一下IP/TCP/Socket)

JNI包括Java代码和Native代码,所谓的native代码并非说一定是C的,即使你用其它的语言实现也可以,但是需要把它包装成操作系统特定的库,JRE中会有专门的代码去利用操作系统接口去动态加载它。

实现JNI的主体步骤如下:

1)        完成Java代码

2)        完成native代码

3)        封装native代码到系统库

4)        使用native

2.      Step By Step样例

我们一步一步来实现一个基于Sun JDKJNI的例子。其中,native代码用C来实现。而最终,这个JNI的例子将分别被部署到windowslinux上,两者有小小的区别将在后面说明。

l  Java

在需要使用native方法的类中,加上native的声明,然后像abstract方法一样不必给出实现。

package demo;

public class HelloWorld {

    final static String name = "laurence";

public static String getName(){

   return name;

}

    public native String sayHello(String msg);

}

很普通的Java类,注意其中的阴影部分。

l  C

分为两部分

1)         生成native代码的头文件

2)         实现native代码

生成native头文件

javah -classpath target/classes -d . demo.HelloWorld

target/classes是指定当前目录下的target/classes目录为classpathdemo.HelloWorldclass文件就在这下面

-d指输出头文件的目录,这里设为当前了

demo.HelloWorld是包含了native方法声明的Java类名

 

完成javah命令之后,会输出一个头文件,在本例中是demo_HelloWorld.h,代码如下:

/* DO NOT EDIT THIS FILE - it is machine generated */

#include <jni.h>

/* Header for class demo_HelloWorld */

 

#ifndef _Included_demo_HelloWorld

#define _Included_demo_HelloWorld

#ifdef __cplusplus

extern "C" {

#endif

    /*

     * Class:     demo_HelloWorld

     * Method:    sayHello

     * Signature: (Ljava/lang/String;)Ljava/lang/String;

     */

    JNIEXPORT jstring JNICALL Java_demo_HelloWorld_sayHello

    (JNIEnv *, jobject, jstring);

 

#ifdef __cplusplus

}

#endif

#endif

实现native代码

C实现demo_HelloWorld.c,代码如下:

#include "demo_HelloWorld.h"

#include <time.h>

 

JNIEXPORT jstring JNICALL Java_demo_HelloWorld_sayHello(JNIEnv* env,

       jobject method, jstring param) {

    char buf[1025];

    const char *pt = (*env)->GetStringUTFChars(env, param, NULL);

    time_t now;

    time(&now);

    strcpy(buf, pt);

    strcat(buf, asctime(localtime(&now)));

    return (*env)->NewStringUTF(env, buf);

}

这个方法做的事情就是读取参数param,在后面加上个时间戳并返回新的字符串。

简单解释一下其中的关键行代码。

GetStringUTFCharsjre中提供的jni方法,用来得到java string的字符串。

NewStringUTFjre中提供的jni方法,用来新建java string

具体的jni方法,请参考sunjni帮助文档和样例。

l  操作系统相关

对于不同的操作系统,都有系统相关的库封装方式。在Linux上是Shared Object(.so文件),在Windows上就是Dynamic Load Library(.dll文件),其它不常用的请自行解决吧。

Linux

不需要额外的工作,直接编译成Shared Object即可。

一条指令全搞定:

gcc  -Wall -m32 -fPIC -I/usr/java5/include  -I/usr/java5/include/linux  -Wl,-melf_i386  -shared  -lc  -Wl,--soname=hello <s

分享到:
评论

相关推荐

    JNI完全技术手册

    这个"JNI完全技术手册"显然是一份详尽的指南,涵盖了JNI的各个方面,包括基本概念、设置环境、调用本地方法、处理数据类型、异常处理等。下面将详细介绍这些知识点。 1. **JNI基础**:JNI是Java与本地代码交互的...

    JNI完全技术手册.pdf

    这本书《JNI完全技术手册》应该是深入探讨这个主题的详细指南。 JNI的核心概念主要包括以下几个方面: 1. **本地方法接口**:本地方法是Java类中的一个方法,但它的实现是在本地(非Java)代码中。JNI提供了定义和...

    JNI完全手册

    综上所述,《JNI完全手册》不仅是一份技术文档,更是JNI技术的全面指南,涵盖了从概念理解、应用场景到具体实践的所有方面,是Java开发者深入掌握JNI不可或缺的资源。通过学习和运用JNI,开发者可以克服Java在某些...

    android-jni操作指南

    1. **JNI数据类型映射**:Java和C/C++的数据类型不完全相同,如Java的`int`对应C/C++的`jint`,`String`对应`jstring`等。JNI提供了一套数据类型转换机制。 2. **字符串处理**:JNI中,`jstring`需要通过`env-&gt;...

    android_jni操作指南.zip

    3. 数据类型转换:Java和C/C++的数据类型不完全对应,需要进行适当的转换。 4. 多线程支持:在多线程环境中,需要正确同步访问共享数据。 六、Android Studio与JNI 现代Android开发中,使用Android Studio可以更...

    【计算机专业-Andorid项目源码100套之】JNI编程指南

    3. **数据类型转换**:JNI中Java与C/C++的数据类型并不完全对应,文档可能会详细解释如何在两者之间进行数据类型转换,例如基本类型、对象引用、数组等。 4. **JNI函数调用**:讲解如何从Java代码调用C/C++函数,...

    jni编程指南(相当给力的说明文档)

    #### 知识点一:JNI完全手册概览 - **主要内容**:此章节提供了一个全面的JNI手册概览,适用于初步了解JNI的基础概念及其在实际开发中的应用。 #### 知识点二:JNI概念与百度百科概述 - **主要内容**:介绍了JNI的...

    android jni详细介绍

    android jni详细介绍,包括如下...android_jni操作指南.pdf Android技术之JNI和HAL.pdf Android通过JNI调用驱动程序(完全解析实例).doc 由浅入深,让你了解JNI如何在android里使用,也可以顺便了解一下android hal机制.

    JNI Programmer Guide and Specification

    《Java™ Native Interface Programmer’s Guide and Specification》是一本由Sheng Liang编写的关于Java Native Interface(JNI)的专业指南与规范书籍。该书由Addison-Wesley出版,并在多个地区发行。版权归属于...

    网上整理的JNI教程

    - **JNI完全手册**:这份手册涵盖了JNI的基础概念、工作原理以及详细的使用指南。它不仅适合初学者入门,也适用于有一定经验的开发者深入理解JNI的技术细节。 #### 二、JNI基础知识 - **JNI-百度百科**:这一章节...

    JavaJNI资料全整理含自己的常见问题总结.pdf

    #### Java: JNI完全手册 1. **基础知识**:介绍JNI的基本概念、工作原理以及开发流程。 2. **高级主题**:涵盖更深入的主题,如性能优化、多线程支持等。 3. **示例代码**:提供丰富的示例代码帮助理解如何在实际...

    Rust-Java-JNI:关于如何使用JNI(Java本机接口)将Rust和Java连接在一起的实验项目

    该存储库可用作入门指南。 如何繁殖 添加带有本机标识符的Java方法 运行javah class-file或javah -classpath path-to-jar files class-name 路径到jar可能还包含多个jar( javah -classpath target/* Test ) ...

    Java数据库应用程序编程指南数据库脚本

    本文将深入探讨如何使用Java进行数据库应用程序编程,特别是关于创建和管理数据库脚本的实践指南。我们将主要关注Java与Oracle数据库的交互,因为压缩包中的文件名"OracleScripts"暗示了我们讨论的是Oracle数据库的...

    Android模拟器使用指南[归类].pdf

    《Android模拟器使用指南》是一份详尽的文档,它主要介绍了如何有效地使用Android Emulator进行应用程序测试和开发。Android Emulator是一个强大的工具,能够模拟真实设备的各种功能,包括电话本、通话、浏览器以及...

    java调用dll或so库示例

    - 数据类型转换:Java与C++的数据类型不完全相同,需注意数据类型的正确映射。 - 错误处理:在C++代码中添加适当的错误处理,确保异常情况下能正确地返回错误信息给Java层。 6. **学习资源** - JNI官方文档:...

    Tomcat tcnative-1.dll 完全解决方案

    本完全解决方案将详细解析这个问题及其解决步骤。 `tcnative-1.dll`是Apache Tomcat的本地库,它是一个实现了OpenSSL接口的库,由Apache Tomcat团队维护。它的主要作用是提供对Java Native Access (JNA) 或者Java ...

    JDeveloper开发指南

    - **第四类驱动**:完全用Java编写,不依赖于其他软件,直接与数据库通信。 - **Oracle JDBC Thin Driver**:Oracle官方提供的第四类驱动,适用于大多数情况,支持JDK 5及以上版本,纯Java实现,无需安装Oracle...

    JNative综合学习资料

    3. 数据类型转换:Java和C/C++的数据类型不完全相同,JNative提供了一套机制来自动处理不同类型之间的转换。 4. 异常处理:JNative支持Java异常到C/C++错误的映射,反之亦然,确保了代码的健壮性。 五、JNative实例...

Global site tag (gtag.js) - Google Analytics