一个jni例子

来源:互联网 发布:ps制作淘宝店招教程 编辑:程序博客网 时间:2024/06/05 23:41

步骤 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:编译 Java 代码

 

接下来,我们需要将 Java 代码编译成字节码。完成这一步的方法之一是使用随 SDK 一起提供的 Java 编译器javac。用来将 Java 代码编译成字节码的命令是:

   

C:\eclipse\workspace\IBMJNI\src\com\ibm\course\jni>javac Sample1.java

 

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

 

第三步是创建 C/C++ 头文件,它定义本机函数说明。完成这一步的方法之一是使用 javah.exe,它是随 SDK 一起提供的本机方法 C 存根生成器工具。这个工具被设计成用来创建头文件,该头文件为在 Java 源代码文件中所找到的每个 native 方法定义 C 风格的函数。这里使用的命令是:

C:\eclipse\workspace\IBMJNI\bin>javah –classpath ./ –jni com.ibm.course.jni.Sample1

 

步骤 4:编写 C/C++ 代码

 

当谈到编写 C/C++ 函数实现时,有一点需要牢记:说明必须和 Sample1.h 的函数声明完全一样。我们将研究用于 C实现和 C++ 实现的完整代码,然后讨论两者之间的差异。

 

C函数实现

以下是 Sample1.c,它是用 C 编写的实现:

  #include "com_ibm_course_jni_Sample1.h"

 

#include

  JNIEXPORT jint JNICALL Java_com_ibm_course_jni_Sample1_intMethod

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

     return num * num;

  }

  JNIEXPORT jboolean JNICALL Java_com_ibm_course_jni_Sample1_booleanMethod

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

   return !boolean;

}

JNIEXPORT jstring JNICALL Java_com_ibm_course_jni_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_com_ibm_course_jni_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

     {   sum += body[i];

     }

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

     return sum;

}

 

C++ 函数实现

以下是 Sample1.cppC++ 实现)

#include "com_ibm_course_jni_Sample1.h"

#include

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

     {   sum += body[i];

     }

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

     return sum;

}

 

C  C++ 函数实现的比较

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

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

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

 

步骤 5:创建共享库文件

接下来,我们创建包含本机代码的共享库文件。大多数 C  C++ 编译器除了可以创建机器代码可执行文件以外,也可以创建共享库文件。用来创建共享库文件的命令取决于您使用的编译器。下面是在 Windows  Solaris 系统上执行的命令。

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

Solariscc -G -I/usr/local/jdk/include -I/user/local/jdk/include/solaris Sample1.c -o Sample1.so

 

步骤 6:运行 Java 程序

最后一步是运行 Java 程序,并确保代码正确工作。因为必须在 Java 虚拟机中执行所有 Java 代码,所以需要使用Java 运行时环境。完成这一步的方法之一是使用 java,它是随 SDK 一起提供的 Java 解释器。所使用的命令是:

   

java com.ibm.course.jni.Sample1

0 0
原创粉丝点击