JNI使用实例(Windows版本)自己实战演示过

来源:互联网 发布:重装系统桌面数据恢复 编辑:程序博客网 时间:2024/05/21 09:45
根据网上流传的JNI步骤实践了一把:

1) 编写java程序,声明本地方法:
   D:\JavaIDE\JBuilder2007\workspace\Test_JAVA\jni\HelloJNI.java 程序如下

package jni;
public class HelloJNI {
  public native void displayHello();
  public native void showTime();

  private native String getLine(String prompt);

  static {
    System.loadLibrary("hello");
  }

  public static void main(String[] args) throws Exception {
    HelloJNI hj = new HelloJNI();

    System.out.println("==> Demo 1: hello");
    hj.displayHello();
    System.out.println("==> Demo 2: time");
    hj.showTime();

    System.out.println("==> Demo 3: input");
    String input = hj.getLine("Type a line: ");
    System.out.println("User typed: " + input);
  }
}

2)编译java文件,eclipse自动编译或者自己手动编译javac HelloJNI.java

3) 根据字节码生成头文件: javah jni.HelloJNI (注意要到项目源码根目录D:\JavaIDE\JBuilder2007\workspace\Test_JAVA上执行)
会在源码目录上生成头文件:jni_HelloJNI.h, 内容如下(无需自己修改):

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class jni_HelloJNI */

#ifndef _Included_jni_HelloJNI
#define _Included_jni_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     jni_HelloJNI
 * Method:    displayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_jni_HelloJNI_displayHello
  (JNIEnv *, jobject);

/*
 * Class:     jni_HelloJNI
 * Method:    showTime
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_jni_HelloJNI_showTime
  (JNIEnv *, jobject);

/*
 * Class:     jni_HelloJNI
 * Method:    getLine
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_jni_HelloJNI_getLine
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

4)实现头文件中的方法:HelloJNIImpl.cpp

// HelloJNIImpl.cpp : Defines the entry point for the console application.
//
#include <jni.h>
#include <iostream>
#include <ctime>
#include <string>
#include <cstdio>
#include <windows.h>
#include "jni_HelloJNI.h"

extern "C" {
  //
}

using namespace std;

JNIEXPORT void JNICALL Java_jni_HelloJNI_displayHello(JNIEnv * env, jobject obj) {
  cout << "Hello, JNI tech. This is from C++!" << endl;
}

JNIEXPORT void JNICALL Java_jni_HelloJNI_showTime(JNIEnv * env, jobject obj) {
  time_t sec;
  tm t;

  time_t loop;

  cout << "时间:";
  sec = time(NULL);
  t = *localtime(&sec);
  unsigned int hour = t.tm_hour;
  unsigned int mini = t.tm_min;
  unsigned int secd = t.tm_sec;
  
  if(hour < 10) {
  cout << "0" << hour;
  }
  else {
    cout << hour;
  }
  cout << ":";
  if(mini < 10) {
    cout << "0" << mini;
  }
  else {
    cout << mini;
  }
  cout << ":";
  if(secd < 10) {
    cout << "0" << secd;
  }
  else {
    cout << secd;
  }
  cout << endl;
}

JNIEXPORT jstring JNICALL Java_jni_HelloJNI_getLine(JNIEnv * env, jobject obj, jstring prompt) {
  char buf[128] = {0};
  const char * str = (env)->GetStringUTFChars(prompt, 0);
//   printf("%s", str);
  cout << str;
  (env)->ReleaseStringUTFChars(prompt, str);
  string buffer;
  getline(cin, buffer);
//   scanf("%s", buf);
  return (env)->NewStringUTF(buffer.c_str());


5)根据HelloJNIImpl.cpp生成dll文件:

用VC的命令行工具执行:

cl -I %JAVA_HOME%/include -I %JAVA_HOME%/include/win32 -LD D:/JavaIDE/JBuilder2007/workspace/Test_JAVA/HelloJNIImpl.cpp -Fe hello.dll

把生成的dll文件拷贝到D:\JavaIDE\JBuilder2007\workspace\Test_JAVA目录

6)测试
在D:\JavaIDE\JBuilder2007\workspace\Test_JAVA目录下运行字节码文件

java jni.HelloJNI

控制台输出:
==> Demo 1: hello
Hello, JNI tech. This is from C++!
==> Demo 2: time
时间:18:58:15
==> Demo 3: input
Type a line: 

输入字符串后回显