您的位置:首页 > 运维架构 > Linux

Linux 下java 中添加c++

2016-04-19 11:51 447 查看
今天尝试使用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下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: