JNI : Java程式呼叫C方法
1、新建一個Java類名稱為:TestJavaCallC
2、在類中新增如下程式碼:
package Test;
public class TestJavaCallC {
public native void sayHello();
public static void main(String[] args){
System.loadLibrary("NativeCode1");
TestJavaCallC tNative = new TestJavaCallC();
tNative.sayHello();
}
}
3、windows環境下:
3.1、執行–>cmd–>進入TestJavaCallC 專案的src目錄下編譯該Java類,命令 javac .(具體路徑)/TestJavaCallC .java。在該TestJavaCallC .java目錄下會生成TestJavaCallC .class檔案
3.2使用javah生成標頭檔案,命令 javah -jni Test.TestJavaCallC 。在src目錄下生成Test_TestJavaCallC.h檔案。檔案內容:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Test_TestJavaCallC */
#ifndef _Included_Test_TestJavaCallC
#define _Included_Test_TestJavaCallC
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Test_TestJavaCallC
* Method: sayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_Test_TestJavaCallC_sayHello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
4、生成C/C++的DLL檔案。
4.1、開啟VS2013–>新建Visual C++ –>Win32專案–>點選確認
4.2、點選下一步–>選擇DLL(D)–>點選完成
4.3、將上一步生成的Test_TestJavaCallC.h新增到生成的專案標頭檔案中。
4.4、在專案原始檔中新增NativeCode1.cpp檔案。
4.5、在NativeCode1.cpp檔案中新增如下程式碼(如果標頭檔案Test_TestJavaCallC.h無法載入,則需要手動配置:專案右鍵–>屬性–>C/C++ –>常規–>附加包含目錄,將投檔案的路徑新增進去,如果有多個不同路徑,則新增多個):
// NativeCode1.cpp : 定義 DLL 應用程式的匯出函式。
//
#include "stdafx.h"
#include "Test_TestJavaCallC.h"
#include<iostream>
using namespace std;
JNIEXPORT void JNICALL Java_Test_TestJavaCallC_sayHello(JNIEnv *, jobject)
{
cout << "hello word" << endl;
}
4.6、專案右鍵–>生成,在Debug目錄下生成一個NativeCode1.dll檔案。將其拷貝到java環境變數Java_Home的Bin目錄下,如:C:\Program Files\Java\jdk1.7.0_79\bin中。
5、執行Java程式:
package Test;
public class TestJavaCallC {
public native void sayHello();
public static void main(String[] args){
System.loadLibrary("NativeCode1");
TestJavaCallC tNative = new TestJavaCallC();
tNative.sayHello();
}