您当前位置:设计在线网 >> linux >> 浏览文章

linux下java通过jni函数接口调用c++

分享到:
本文章讲述了linux下java通过jni函数接口调用c++.

linux下

java通过jni函数接口调用c++思路概述:用java定义好与c++的接口类及类中的各个native static函数,编译成.h文件,并用c++实现各个函数,然后编译生成so文件,最后java就可以调用了。

主要步骤

1. 编写java文件

假如命名为testdll.java

/*java for c++, dll or so */

publicclasstestdll

{

publicnativestaticintget();

publicnativestaticvoidset(inti);

publicnativestaticvoidHelloWord();

publicnativestaticString cToJava();

}

2. 编译生成.h文件

进入该文件所在的文件夹后,使用如下两个命令:

javac testdll.java

javah testdll

此时已经生成testdll.h,注意,不要自己编辑这个.h文件。

3. 编写cpp文件

实现在.h文件中定义的函数,即testdll.cpp文件。同时根据工程需要,编写和添加相应的各种.h及.cpp文件。

4.编译生成.so文件

笔者使用的是g++编译。

主要包括以下命令:

g++ -I /usr/lib/jvm/java-6-sun/include/linux/ -I /usr/lib/jvm/java-6-sun/include/ -fPIC -c testdll.cpp (在testdll.cpp处必须写上工程中所有的source file,如cpp及cc文件,否则调用时会有错误)。

在使用以上语句前,首先找到自己的java存储路径和jni.h文件的路径,不同的机器是不一样的,如我的机器路径如下:

/usr/lib/jvm/java-6-sun/include/linux/

/usr/lib/jvm/java-6-sun/include/

此语句生成了testdll.o

接着利用testdl.o文件生成so文件,名字自己取,但必须以lib开头。

g++ -shared -Wl,-soname,libhello.so.1 -o libhello.so.1.0 testdll.o

生成libhello.so.1.0

接下来将生成的共享库拷贝为标准文件名

cp libhello.so.1.0 libhello.so

当然,以上g++的两句命令也可以使用一句话完成:

g++ -I /usr/lib/jvm/java-6-sun/include/linux/ -I /usr/lib/jvm/java-6-sun/include/ -fPIC -shared -o libhello.so testdll.cpp

然后使用命令通知动态链接程序此共享文件的路径:

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

5.

将此so文件复制到java工程所在位置,src文件夹外。

调用的main函数如下,

public class mytest

{

static

{

System.loadLibrary("testdll"); //Linux下去掉开头的lib字符

}

public static void main(String[] args)

{System.out.println("ok");testdll.HelloWord();//这些方法都是static类型的

System.out.println(testdll.cToJava());

testdll.set(10);

System.out.println(testdll.get());

}

}

运行结果:

ok

hello world in helloword!

Hello,word in ctojava!

推荐阅读:
介绍一些linux ftp命令参数
linux下java jni调用C语言动态链接库的具体操作步骤
介绍JAVA 调用LINUX命令类
推荐文章  
赞助商链接  
热门排行  
主题推广  
中国设计在线网 All Rights Reserved. 互联网违法和不良信息举报
信息产业部备案号:湘ICP备09001063号