今天尝试使用java调用c++。 流程记录一下吧,因为遇到不少坑。
1. 创建 MyTest.java
1) mkdir net; cd net; mkdir test; //包名: net.test
2)cd testt; vi MyTest.java
package net.test;
public class MyTest {
private native void test();
public static void main(String[] args) {
// TODO Auto-generated method stub
new MyTest().test();
System.out.println("AAAAAAAAA");
}
static{
//System.load("/home/liulei/workspace/eclipse/test/src/net/test.so");
System.loadLibrary("test");
}
}
(3) cd ../.. //返回net目录
javac net/test/MyTest.java //在net/test下生成了MyTest.class
(4)javah -jni -classpath . net.test.MyTest //生成net.test.MyTetst.h
package net.test;
public class MyTest {
private native void test();
public static void main(String[] args) {
// TODO Auto-generated method stub
new MyTest().test();
System.out.println("AAAAAAAAA");
}
static{
//System.load("/home/liulei/workspace/eclipse/test/src/net/test.so");
System.loadLibrary("test");
}
}
(5) 写test.cpp. 按照net.test.MyTest.h中函数的形式定义:
#include <iostream>
#include "net_test_MyTest.h"
JNIEXPORT void JNICALL Java_net_test_MyTest_test
(JNIEnv *env, jobject obj)
{
std::cout<<"-----------"<<std::endl;
}
(6) 编译为.so
g++ -fpic -shared test.cpp -o libtest.so -I/home/liulei/software/jdk1.8.0_74/include -I /home/liulei/software/jdk1.8.0_74/include/linux/
(7) 将libtest.so的路径加入到LD_LIBRARY_PATH中。
(8) java net.test.MyTest执行
如果遇到Error: Could not find or load main class net.test.MyTest,和可能是你的.bashrc中定义的classpath不包含当前目录(.); 修改为:
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
(9) 关键一点: 要将接口给别的java程序使用,需要制作so的java项目做成jar包,并将其中的so文件拷至调用者的java-library_path下。