当前位置:首页 > 开发 > 编程语言 > Java > 正文

用JNI进行java编程

发表于: 2012-11-30   作者:sunjing   来源:转载   浏览次数:
jni
摘要: (摘自 IBM DW)      JNI ( Java Native Interface) 是一个本机编程接口,它是 Java 软件开发工具箱( Java Software Development Kit (SDK) )的一部分。 JNI 允许 Java 代码使用以其它语言(譬如 C 和 C++ )编写的代码和代码库。 Inv

(摘自 IBM DW)

     JNI ( Java Native Interface) 是一个本机编程接口,它是 Java 软件开发工具箱( Java Software Development Kit (SDK) )的一部分。 JNI 允许 Java 代码使用以其它语言(譬如 C C++ )编写的代码和代码库。 Invocation API JNI 的一部分)可以用来将 Java 虚拟机( JVM )嵌入到本机应用程序中,从而允许程序员从本机代码内部调用 Java 代码。
    当无法用
Java 语言编写整个应用程序时, JNI 允许您使用本机代码。在下列典型情况下,您可能决定使用本机代码:
  • 希望用更低级、更快的编程语言去实现对时间有严格要求的代码。
  • 希望从 Java 程序访问旧代码或代码库。
  • 需要标准 Java 类库中不支持的依赖于平台的特性。

 

步骤 1 :编写 Java 代码

public class Sample1 {

public native int intMethod(int n);

 

public native boolean booleanMethod(boolean bool);

 

public native String stringMethod(String text);

 

public native int intArrayMethod(int [] intArray);

 

public static void main(String[] args) {

System.loadLibrary ("Sample1");

Sample1 sample = new Sample1();

int square = sample.intMethod(5);

boolean bool = sample.booleanMethod(true );

String text = sample.stringMethod("JAVA");

int sum = sample.intArrayMethod(new int [] { 1, 1, 2, 3, 5, 8, 13 });

 

System.out .println("intMethod: " + square);

System.out .println("booleanMethod: " + bool);

System.out .println("stringMethod: " + text);

System.out .println("intArrayMethod: " + sum);

}

}

 

步骤 2 :创建 C/C++ 头文件

    执行如下命令:

javah Sample1

    生成文件内容如下:

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

#include <jni.h>

/* Header for class Sample1 */

 

#ifndef _Included_ Sample1

#define _Included_ Sample1

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class: Sample1

* Method: intMethod

* Signature: (I)I

*/

JNIEXPORT jint JNICALL Java_ Sample1_intMethod

(JNIEnv *, jobject, jint);

 

/*

* Class: Sample1

* Method: booleanMethod

* Signature: (Z)Z

*/

JNIEXPORT jboolean JNICALL Java_ Sample1_booleanMethod

(JNIEnv *, jobject, jboolean);

 

/*

* Class: Sample1

* Method: stringMethod

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

*/

JNIEXPORT jstring JNICALL Java_ Sample1_stringMethod

(JNIEnv *, jobject, jstring);

 

/*

* Class: Sample1

* Method: intArrayMethod

* Signature: ([I)I

*/

JNIEXPORT jint JNICALL Java _Sample1_intArrayMethod

(JNIEnv *, jobject, jintArray);

 

#ifdef __cplusplus

}

#endif

#endif

    头文件中 JNIEXPORT JNICALL 是用于导出函数的、依赖于编译器的指示符。返回类型是映射到 Java 类型的 C/C++ 类型

    除了 Java 声明中的一般参数以外,所有这些函数的参数表中都有一个指向 JNIEnv jobject 的指针。

    指向 JNIEnv 的指针实际上是一个指向函数指针表的指针。这些函数提供各种用来在 C C++ 中操作 Java 数据的能力。

jobject 参数引用当前对象。因此,如果 C C++ 代码需要引用 Java 函数,则这个 jobject 充当引用或指针,返回调用的 Java 对象。

     函数名本身是由前缀 “Java_” 加全限定类名,再加下划线和方法名构成的。

 

步骤 3 :编写 C/C++ 代码 , 创建共享库文件

编写 C/C++ 函数实现时,有一点需要牢记:说明必须和 Sample1.h 的函数声明完全一样。

C 实现 Sample1.c

#include "Sample1.h"

#include <string.h>

 

JNIEXPORT jint JNICALL Java_Sample1_intMethod

(JNIEnv *env, jobject obj, jint num) {

return num * num;

}

 

JNIEXPORT jboolean JNICALL Java_Sample1_booleanMethod

(JNIEnv *env, jobject obj, jboolean boolean) {

return !boolean;

}

 

JNIEXPORT jstring JNICALL Java_Sample1_stringMethod

(JNIEnv *env, jobject obj, jstring string) {

const char *str = (*env)->GetStringUTFChars(env, string, 0);

char cap[128];

strcpy(cap, str);

(*env)->ReleaseStringUTFChars(env, string, str);

return (*env)->NewStringUTF(env, strupr(cap));

}

 

JNIEXPORT jint JNICALL Java_Sample1_intArrayMethod

(JNIEnv *env, jobject obj, jintArray array) {

int i, sum = 0;

jsize len = (*env)->GetArrayLength(env, array);

jint *body = (*env)->GetIntArrayElements(env, array, 0);

for (i=0; i<len; i++)

{ sum += body[i];

}

(*env)->ReleaseIntArrayElements(env, array, body, 0);

return sum;

}

 

void main(){}

 

C++ 实现 Sample1.cpp

#include "Sample1.h"

#include <string.h>

 

JNIEXPORT jint JNICALL Java_Sample1_intMethod

(JNIEnv *env, jobject obj, jint num) {

return num * num;

}

 

JNIEXPORT jboolean JNICALL Java_Sample1_booleanMethod

(JNIEnv *env, jobject obj, jboolean boolean) {

return !boolean;

}

 

JNIEXPORT jstring JNICALL Java_Sample1_stringMethod

(JNIEnv *env, jobject obj, jstring string) {

const char *str = env->GetStringUTFChars(string, 0);

char cap[128];

strcpy(cap, str);

env->ReleaseStringUTFChars(string, str);

return env->NewStringUTF(strupr(cap));

}

 

JNIEXPORT jint JNICALL Java_Sample1_intArrayMethod

(JNIEnv *env, jobject obj, jintArray array) {

int i, sum = 0;

jsize len = env->GetArrayLength(array);

jint *body = env->GetIntArrayElements(array, 0);

for (i=0; i<len; i++)

{ sum += body[i];

}

env->ReleaseIntArrayElements(array, body, 0);

return sum;

}

 

void main(){}

 

C C++ 函数实现的比较

C C++ 代码几乎相同;唯一的差异在于用来访问 JNI 函数的方法。在 C 中, JNI 函数调用由“ (*env)-> ”作前缀,目的是为了取出函数指针所引用的值。在 C++ 中, JNIEnv 类拥有处理函数指针查找的内联成员函数。下面将说明这个细微的差异,其中,这两行代码访问同一函数,但每种语言都有各自的语法。

 

C 语法: jsize len = (*env)->GetArrayLength(env,array);

C++ 语法: jsize len =env->GetArrayLength(array);

 

用来创建共享库文件的命令取决于您使用的编译器。下面是在 Windows 系统上执行的命令。

Windows cl -Ic:\jdk\include -Ic:\jdk\include\win32 -LD Sample1.c -FeSample1.dll

完成以上步骤后,就可以运行Java程序Sample1了,应该获得下列结果:

        intMethod: 25
        booleanMethod: false
        stringMethod: JAVA
        intArrayMethod: 33

用JNI进行java编程

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
本地代码中使用Java对象 通过使用合适的JNI函数,你可以创建Java对象,get、set 静态(static)和 实
Python可用的GUI编程的包很多,Tkinter也是其中一个半标准的工具包。 作为一个老牌的Python GUI工具
package com.java.test_IO; import java.io.RandomAccessFile; /** * 表示一个已经存在的Bmp图片,
package com.java.test_IO; import java.io.RandomAccessFile; /** * 表示一个已经存在的Bmp图片,
创建工程:结构如下 代码如下: package com.tcl.testjni; public class MyJNI { public native void
用Java进行简单的乘除计算 一、题目简介 一个两个数简单的乘除计算的Java代码并验证是否其正确性。
Hadoop 简介 Hadoop 是一个开源的可运行于大规模集群上的分布式并行编程框架,由于分布式存储对于分
分析 WordCount 程序 我们先来看看 Hadoop 自带的示例程序 WordCount,这个程序用于统计一批文本文
Hadoop 简介 Hadoop 是一个开源的可运行于大规模集群上的分布式并行编程框架,由于分布式存储对于分
Hadoop 是一个实现了 MapReduce 计算模型的开源分布式并行编程框架,借助于 Hadoop, 程序员可以轻松
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号