Java Programming Tutorial-JNI(翻译)(续)

JNI with C/C++ Mixture

 

第一步:写一个使用Native代码的java类 HelloJNICpp.java

public class HelloJNICpp {
   static {
      System.loadLibrary("hello"); // hello.dll (Windows) or libhello.so (Unixes)
   }
 
   private native void sayHello();
 
   public static void main(String[] args) {
      new HelloJNICpp().sayHello();
   }
}

 编译HelloJNICpp.java成HelloJNICpp.class

   

javac HelloJNICpp.java

 

    第二步: 创建一个C/C++的头文件 HelloJNICpp.h

    

javah HelloJNICpp

    生成的头文件HelloJNICpp.h 包括以下内容

    JNIEXPORT void JNICALL java_HelloJNICpp_sayHello(JNIEnv*, jobject);

 

    第三 步:C/C++实现 HelloJNICppImpl.h  HelloJNICppImpl.cpp 和HelloJNICpp.c

    我们应该实现程序HelloJNICppImpl.h 和HelloJNICppImpl.cpp在C++代码里面,但是实现Java接口在HellJNICp在C里面。

    C++ Header - "HelloJNICppImpl.h"

    

#ifndef _HELLO_JNI_CPP_IMPL_H
#define _HELLO_JNI_CPP_IMPL_H
 
#ifdef __cplusplus
        extern "C" {
#endif
        void sayHello ();
#ifdef __cplusplus
        }
#endif
 
#endif

 

    C++实现 - "HelloJNICppImpl.cpp"

    

#include "HelloJNICppImpl.h"
#include  <iostream>
 
using namespace std;
 
void sayHello () {
    cout << "Hello World Again!" << endl;
    return;
}

     C实现java接口 - "HelloJNICpp.c"

    

#include <jni.h>
#include "HelloJNICpp.h"
#include "HelloJNICppImpl.h"
 
JNIEXPORT void JNICALL Java_HelloJNICpp_sayHello (JNIEnv *env, jobject thisObj) {
    sayHello();  // invoke C++ function
    return;
}

    编译C/C++程序到hello.dll

    

MinGW  GCC in windows

>g++ -Wl,--add-stdcall-alias -I"<JAVA_HOME>\include" -I"<JAVA_HOME>\include\win32" 
      -shared -o hello.dll HelloJNICpp.c HelloJNICppImpl.cpp

   第四步:运行Java程序

   

> java HelloJNICpp
or
> java -Djava.library.path=. HelloJNICpp

 

   

你可能感兴趣的:(programming)