eclipse 初試jni

JNI=java native interface, 爲java應用程序提供調用本地方法的接口
     The standard Java class library may not support the platform-dependent features needed by your application.
    You may already have a library or application written in another programming language and you wish to make it accessible to Java applications.
    You may want to implement a small portion of time-critical code in a lower-level programming language, such as assembly, and then have your Java application call these functions

步驟:
1.編寫帶有native聲明的方法的java類

package jni;

public class HelloWorld {
    
static{
        System.loadLibrary(
"hellodll");
    }


    
public native void dispHelloWorld();
    
/**
     * 
@param args
     
*/

    
public static void main(String[] args) {
        
// TODO Auto-generated method stub
        
//System.out.println("abc");
        new HelloWorld().dispHelloWorld();
    }


}


2,保存後如果沒有錯誤eclipse會編譯產生jni/HelloWorld.class


3,假設工程產生的class都在 classes文件夾下(這個文件夾名字跟個人eclipse設置有關,也可能就是工程根目錄),那麼控制檯cd到classes用javah命令產生h 文件,XXX/classes>javah -jni jni.HelloWorld(package不要漏掉),產生的jni_HelloWorld.h文件如下


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

#ifndef _Included_jni_HelloWorld
#define _Included_jni_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     jni_HelloWorld
 * Method:    dispHelloWorld
 * Signature: ()V
 
*/

JNIEXPORT 
void JNICALL Java_jni_HelloWorld_dispHelloWorld
  (JNIEnv 
*, jobject);

#ifdef __cplusplus
}

#endif
#endif

4,寫cpp,實現jni_HelloWorld.h中的函數,這裏請注意函數名,cpp裏的函數名跟h文件的函數名要一致,如果是從網上 copy的一些例子,函數名跟你例子的名字不一致雖然之後可以正確編譯併產生dll,但是最終運行java程序鏈接的時候會出錯,拋出 java.lang.UnsatisfiedLinkError異常,本人就在此浪費了很長時間。


jni_HelloWorldImp.cpp內容如下:


#include <jni.h>
#include 
"jni_HelloWorld.h"
#include 
<stdio.h>
JNIEXPORT 
void JNICALL Java_jni_HelloWorld_dispHelloWorld
(JNIEnv 
*env, jobject obj)
{
    printf(
"Hello world ! ");
    
return;
}

5,編譯cpp產生dll,在控制檯下>cl -I%java_home%\include -I%java_home%\include\win32 -LD jni_HelloWorldImp.cpp -Fehellodll.dll


以上命令的參數中,-I表示編譯包含的額外目錄,-LD表示產生dll,-Fe後面表示產生dll的名字,具體的參數可以自己用cl -help命令查看,cl環境配置可以參考

用vs編譯器cl在控制檯下編譯

一文


如果成功編譯,會產生hellodll.dll,hellodll.lib,hellodll.exp三個文件,將hellodll.dll考到工程根目錄下。



6,運行java程序,輸出Hello world !

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章