java 调用 Cpp
整体目录结构
编译java文件 生成class文件
执行 javac HelloWorld.java ,生成 HelloWorld.class文件
public class HelloWorld {
static {
System.loadLibrary("HelloWorld");
}
private native void print();
public static void main(String[] args) {
new HelloWorld().print();
}
}
生成HelloWorld 的.h文件 根据.h文件编写对应的jni.cpp文件 。 注意这个类型签名问题,各自项目可能需要再对用的java文件处生成该.h
执行 javah -jni HelloWorld 生成HelloWorld.h文件
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloWorld
* Method: print
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_print
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
编译cpp 注意使用自己的jdk目录。
windows下 where java查看安装目录 :执行
g++ -shared -fPIC -I"D:\Program Files\Java\jdk1.8.0_152\include" -I"D:/Program Files/Java/jdk1.8.0_152/include/win32" -o HelloWorld.dll HelloWorld.c
Linux下which java查看安装目录: 执行
g++ -shared -fPIC -I/usr/lib/jdk_8/jdk1.8.0_202/include -I/usr/lib/jdk_8/jdk1.8.0_202/include/linux -o libHelloWorld.so HelloWorld.cpp
#include <stdio.h>
#include <stdlib.h>
#include <jni.h>
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT void JNICALL Java_HelloWorld_print(JNIEnv *env, jobject obj)
{
printf("Hello World!\n");
return;
}
#ifdef __cplusplus
}
#endif
运行 Java 代码 需要指定当前的库目录
java -Djava.library.path=. HelloWorld
ok!!
注意事项: 库找不到需要看下 (坑)
windows下:
HelloWorld.dll 文件 和 你java 中引用的文件名是否一致。 System.loadLibrary(“HelloWorld”);
linux下:
libHelloWorld.so 文件 和 你java 中引用的文件名是否一致,前面需要增加lib开头。 System.loadLibrary(“HelloWorld”);