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

本文详细介绍了如何使用JNI技术将C/C++代码整合到Java应用中,通过编写Java类、创建C/C++头文件、实现C/C++代码以及编译生成DLL或SO库,最终在Java程序中调用C/C++功能。涵盖了从编译Java源码到运行Java程序的全过程。
1086

被折叠的 条评论
为什么被折叠?



