Java JNI浅析(一)

JNI是Java Native Interface的 缩写。从Java 1.1开始,Java Native Interface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。    使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的,比如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少保证本地代码能工作在任何Java 虚拟机实现下。    JNI(Java Native Interface)的书写步骤 编写带有native声明的方法的java类使用javac命令编译所编写的java类使用javah  jni java类名生成扩展名为h的头文件    使用C/C++实现本地方法    将C/C++编写的文件生成动态连接库编写java程序 这里以One world为例 public class StringDLL{    static    {    System.loadLibrary("testStringJNI");    }    public native static String get();    public native static void set(String name);    public static void main(String[] args){        StringDLL s = new StringDLL();        s.set("Hello world");        System.out.println(s.get());    }}如果是静态类型方法则生成的头文件中方法的第二个参数是对java类的引用(JNIEnv *, jclass),如不是静态类型则是对对象的引用(JNIEnv *, jobject)使用javah 生成扩展名为h的头文件/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class StringDLL */#ifndef _Included_StringDLL#define _Included_StringDLL#ifdef __cplusplusextern "C" {#endif/* * Class:     StringDLL * Method:    get * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_StringDLL_get  (JNIEnv *, jclass);/* * Class:     StringDLL * Method:    set * Signature: (Ljava/lang/String;)V */JNIEXPORT void JNICALL Java_StringDLL_set  (JNIEnv *, jclass, jstring);#ifdef __cplusplus}#endif#endif使用C实现本地方法#include "stdafx.h"#include "testStringJNI.h"#include <stdlib.h>const char * chs;jstring s;JNIEXPORT jstring JNICALL Java_StringDLL_get(JNIEnv *env, jclass cls){            /* 简单返回转换const char为jstring */    return (*env)->NewStringUTF(env,chs);}JNIEXPORT void JNICALL Java_StringDLL_set(JNIEnv *env, jclass cls, jstring s){    chs = (*env)->GetStringUTFChars(env,s,0); //java与C类型不同,需用JNI方法进行转换}注意,我们总是用接口指针 env 来操作 Java 对象。使用C++实现本地方法#include "stdafx.h"#include "testStringJNI.h"#include <stdlib.h>const char * chs;jstring s;JNIEXPORT jstring JNICALL Java_StringDLL_get(JNIEnv *env, jclass cls){            /* 简单返回转换const char为jstring */    return env->NewStringUTF(chs);}JNIEXPORT void JNICALL Java_StringDLL_set(JNIEnv *env, jclass cls, jstring s){    chs = env->GetStringUTFChars(s,0); //java与C类型不同,需用JNI方法进行转换}使用 C++ 后,源代码变得更为直接,且接口指针参数消失。但是,C++ 的内在机制与 C 的完全一样。在 C++ 中,JNI 函数被定义为内联成员函数,它们将扩展为相应的 C 对应函数。生成DLL文件在.NET下新建Win32 Project工程名字为“testStringJNI”在Application Setting里Aplication type点选DLL拷贝头文件到工程中书写C++程序实现头文件中定义的方法(见上页)按F7或Build -> Build  Solution我们生成DLL文件就放在工程目录下Debug文件夹里。名字就是 工程名.DLL拷贝DLL到java文件目录下,运行java就可以看到控制台打印出“One world”一个简单java通过JNI调用C、C++就完成了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值