java是跨平台的语言,但是在有些时候仍然是有需要调用本地代码(通常由c/c++编写)
sun公司提供的JNI是java平台的一个功能强大的接口。这个JNI接口提供了Java与操作系统本地代码相互
调用的功能。
Java中调用C/C++代码的步骤:
首先在java类中声明一个native方法。
bin/javah.exe 生成相应的c/c++头文件
按照生成的头文件编写对应的c/c++代码
编译生成dll
把dll文件加入到PATH环境变量下。
Java类中加载DLL,然后调用声明的Native方法。
使用JNI的两个弊端:
使用了JNI,那么这个Java Application将不能跨平台了。如果要移植到别的平台上,那么native代码就需
要重新进行编写。
Java是强类型的语言,而c/c++不是。因此,你必须再写JNI时更小心。
相关文件
TestNative.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class TestNative */
#ifndef _Included_TestNative
#define _Included_TestNative
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: TestNative
* Method: sayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_TestNative_sayHello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
TestNative.java
/**
* @(#)TestNative.java
*
*
* @author leo
* @version 1.00 2008/3/31
*/
public class TestNative {
public TestNative() {
}
//表示是c/c++实现
public native void sayHello();
public static void main(String[] args) {
System.loadLibrary("nativecode.dll");
TestNative tst = new TestNative();
tst.sayHello();
}
}
source.cpp
#include "jni.h"
#include "TestNative.h"
#include <iostream>
using namespace std;
JNIEXPORT void JNICALL Java_TestNative_sayHello (JNIEnv *env, jobject obj)
{
cout << "Hello World!" <<endl;
}
来源:https://www.cnblogs.com/tongzhiyong/archive/2008/03/30/1129901.html