永发信息网

JAVA如何调用C函数

答案:1  悬赏:30  手机版
解决时间 2021-03-30 23:49
JAVA如何调用C函数
最佳答案
要在java中调用c语言的库,需要使用Java提供了JNI。
举例说明
在c语言中定义一个 void sayHello()函数(打印Hello World);然后在Java中调用这个函数显示Hello Word.
现在分别从Java和C语言两部分说明:
1. Java 部分
首先定义一个HelloNative,在其中申明sayHello函数,函数要申明为Native 类型的.如下:
public class HelloNative {
public native void sayHello();
}

编译这个类,生成class文件:
javac HelloWorld.java

利用javah生成需要的h文件
javah HelloNative

生成的 h文件大概如下:


#include


#ifndef _Included_HelloNative
#define _Included_HelloNative
#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT void JNICALL Java_HelloNative_sayHello
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

可以看一下上面自动生成的程序,程序include了jni.h,这个头文件在 $JAVA_HOME下的include文件夹下. 还可以发现生成的函数名是在之前的函数名前面加上了Java_HelloNative。
2. C语言部分
根据上面生成的h文件编写相应的代码实现,建立一个 HelloNative.cpp用来实现显示Hello World的函数.如下:

#include
#include "HelloNative.h"

JNIEXPORT void JNICALL Java_HelloNative_sayHello(JNIEnv *, jobject)
{
printf("Hello World!\n");
}

代码编写完成之后,我们再用gcc编译成库文件,命令如下;
gcc -fPIC -I/usr/lib/jvm/java-7-openjdk-i386/include -I/usr/lib/jvm/java-7-openjdk-i386/include/linux -shared -o libHelloNative.so HelloNative.cpp

这样就会在当前目录下生成一个libHelloNative.so的库文件.这时需要的库已经生成,在C语言下的工作已经完成了.
接下来需要在Java中编写一个程序测试一下.在程序前,需要将我们的库载入进去.载入的方法是调用Java的 System.loadLibrary("HelloNative");

public class TestNative
{
static {
try {
System.loadLibrary("HelloNative");
}
catch(UnsatisfiedLinkError e) {
System.out.println( "Cannot load hello library:\n " + e.toString() );
}
}
public static void main(String[] args) {
HelloNative test = new HelloNative();
test.sayHello();
}
}

但是再编译后,运行的时候,问题又出现了.
Cannot load hello library:
java.lang.UnsatisfiedLinkError: no HelloNative in java.library.path
Exception in thread "main" java.lang.UnsatisfiedLinkError: HelloNative.sayHello()V
at HelloNative.sayHello(Native Method)
at TestNative.main(TestNative.java:13)

载入库失败,但是库明明就是放在当前文件夹下的,怎么会载入失败呢?
用System.getProperty("java.library.path")查看,发现java.library.path中并不u存在当前的目录.主要有以下的几个解决办法:
1) 将生成的库复制到java.library.path有的路径中去,当然这样不是很好
2) 设置环境变量export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ,将当前的目录加入到LD_LIBRARY_PATH中
3) 设置java 的选项,将当前的目录加入到其中 .java -Djava.library.path=. $LD_LIBRARY_PATH
这样之后程序就能够成功的运行了.可以看见显示的"Hello World!"了追问谢谢你的帮助,不过似乎并没有解决我这个问题。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
猫总是在猫砂里打滚是不是身上有跳蚤
小金鱼观察日记怎么写150个字
为什么炸猪排在日本有胜利的意思?
单选题I would have come to
单选题近来,全国许多大中学生积极参与抵制贺
一副1024×1024,灰度级为256的图像,需要多
我的配置咋开gta4流畅,中特效应该能,中特效
计算: (-4)x(-18.36)x2.5 (-3/7)x
既知之 方能破之 啥意思
天鹅的故事中这一举是指什么用课文中的句子
小王钣金喷漆(呼和浩特玉泉区云中路)地址好找
家里卧室的床上出现一种有花纹的蟑螂,貌似是
求大张正己的所有动画作品
note3在手机上格式化内存卡时密码是多少
邻至邻接单后是怎么推广的
推荐资讯
全国有多少人叫书禹
京东的火车票满100减20,怎么用
直角三角形三边上的半圆面积之间有什么关系
请创建信箱名,由3-18个英文,数位,点,减号
请问富邑是指今天的什么地方?
老公刚去世,谁的老公去世了,思念去世的老公
有考过国家电网的吗
空开合上为什么下线没电
发格数控系统,tgk6920镗床z轴伺服故障1121,
被除数与除数的和是980,商是6,被除数和除数
刷第三方rom是不是必须刷第三方recovery
沁阳社保局在焦百哪边
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?