JNI的生成步骤——Mac版(参考资料)
- 编写带有native声明的方法的java类,生成.java文件
- 使用javac命令编译所编写的java类,生成.class文件
- 使用javah -jni java类名生成扩展名为h的头文件,也即生成.h文件
- 使用C/C++(或者其他编程想语言)实现本地方法,创建.h文件的实现,也就是创建.cpp文件实现.h文件中的方法
- 将C/C++编写的文件生成动态连接库,生成jnilib文件
1、写 java 代码:HelloWorld.java
public class HelloWorld {
static{
System.loadLibrary("hello");
}
public native void DisplayHello();
public static void main(String[] args) {
// TODO Auto-generated method stub
new HelloWorld().DisplayHello();
//System.out.println( System.getProperty("java.library.path"));
}
}
2、运行命令:javac HelloWorld.java
在该 HelloWorld.java 所在目录下生成 HelloWorld.class
3、运行命令:javah -jni HelloWorld
使用javah在当前目录下生成 HelloWorld.h 头文件,此文件供C、C++程序来引用并实现其中的函数
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: DisplayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_DisplayHello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
注:1)、此头文件是不需要用户编译的,直接供其它C、C++程序引用。
2)、此头文件中的JNIEXPORT void JNICALL Java_HelloWorld_DisplayHello(JNIEnv *, jobject);方法,是将来与动态链接库交互的接口,并需要名字保持一致。
参考原文链接:https://blog.csdn.net/basementman/article/details/17996445
4、创建HelloWorld.cpp
实现头文件中的方法:
#include "jni.h"
#include "HelloWorld.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloWorld_DisplayHello
(JNIEnv *env, jobject obj)
{
printf("From HelloWorld.cpp :");
printf("Hello world ! \n");
return;
}
此C++文件实现了上述头文件中的函数,注意方法函数名要保持一致。
5、编译C/C++代码
基本格式:
- 编译c程序:gcc -shared -fpic XXX.c -o XXX.so
- 编译c++程序:g++ -shared -fpic XXX.cpp -o XXX.so
-------------------------------------以上内容基本是参考的网上的资料,以下内容未在网上找到完全相同的资料-------------------------------
我在mac上编译c++程序程序的命令:
g++ -I/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/include -I/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/include/darwin -fPIC -shared HelloWorld.cpp -o libhello.jnilib
/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/include,该路径为jni.h头文件所在的位置;
/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/include/darwin,该路径为jni_md.h头文件所在的位置;
g++编译程序时,-I(大写i) 与-L(大写l)-l(小写l) 的作用
6、当前目录下的全部文件
7、运行程序:java HelloWorld
参考的网络资料:
https://www.cnblogs.com/cnliang/p/10496248.html
https://blog.csdn.net/basementman/article/details/17996445
https://www.cnblogs.com/chaguang/p/8306106.html