当C++程序有两个及两个以上的文件时,java调用C++程序的调用过程
备注:程序全程没有使用IDE,单纯用文档编译器与命令行进行编写
步骤一:在文件夹/code/test01/src/com/yhy/jni中新建java程序文件NativeCpp.java
package com.yhy.jni;
public class NativeCpp {
public native void print();
}
编译生成class文件
javac NativeCpp.java
步骤二 生成.h文件
在/code/test01/src目录下打开命令行,输入
javah -jni com.yhy.jni.NativeCpp
将生成的.h文件打开, NativeCpp.h中头文件修改为:
#include "jni.h"
步骤三,编写C++程序,并生成so文件
在/code/test01/src目录下新建hello.cpp文件
#include <jni.h>
#include "com_yhy_jni_NativeCpp.h"
#include "print.h"
#include "stdio.h"
#include "stdlib.h"
#include <iostream>
using namespace std;
JNIEXPORT void JNICALL Java_com_yhy_jni_NativeCpp_print (JNIEnv *, jobject)
{
print_hello();
return;
}
新建print.h文件
#ifndef PRINT_H_
#define PRINT_H_
void print_hello();
#endif /* PRINT_H_ */
新建print.cpp文件
#include <iostream>
using namespace std;
#include <jni.h>
#include "com_yhy_jni_NativeCpp.h"
void print_hello() {
cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
}
打开命令行
g++ -fPIC -c hello.cpp print.cpp -I /usr/lib/jvm/jdk1.8.0_152/include/ -I /usr/lib/jvm/jdk1.8.0_152/include/linux/
备注:后两个参数是jdk的路径
g++ -shared hello.o print.o -o jni.so
此时,so文件已生成
步骤四,调用so文件
将生成的jni.so文件复制到/code/test01/src/com/yhy/jni中
在/code/test01/src/com/yhy/jni中编写App.java
package com.yhy.jni;
public class App{
public static void main( String[] args )
{
//linux下加载库
System.load("/home/yhy/code/test01/src/com/yhy/jni/jni.so");
NativeCpp nativeCpp = new NativeCpp();
nativeCpp.print();
}
}
编译App.java
在目录/src下运行App.class
java com.yhy.jni.App.class