有人用java调用过 C 的函数吗 看看这个http://www.programfan.com/article/showarticle.asp?id=1660 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 网上搜索JNI。比我讲的详细多了。我用过 我们经常要调用C首先 C 要返回两个值 象 执行失败返回-1 成功返回0然后就是JAVA里面去调用C了. 具体怎么调用给你个简单例子这个就是调用C的函数了.class Test{ public int run() { int exitVal = -1; String path = "/../../update/update_sys";//update_sys这个就是C的函数所在路径 Runtime rt = Runtime.getRuntime(); Process proc; try { proc = rt.exec(path); exitVal = proc.waitFor();// 成功返回0,失败返回-1 } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } return exitVal; // System.out.println(exitVal); } public static void main(String args[]){ Test t = new Test(); int i = t.run(); if(i=0){ System.out.println("执行成功"); }else{ System.out.println("执行失败"); }} } ls这个数据怎么看的啊 把名声搞坏了不好意思啊 没有结贴是因为还没有满意的答案 现在都基本结贴给分了 只剩一个我自己回了一个的帖子,给不起来分,除非强制结贴网上我也搜了很多jni的资料 有人在java里调过mfc的扩展dll吗看到有人用jnative、jacob的 不知道这边有没有人用过 能否调用mfc的扩展dll啊 应该不能,JNI只能调用javah处理得到的DLL,如果你要调用的话,用C++封装一下,再用java调用你的C++ dll。另外在windows下请注意,你编译c程序的环境,如果不是纯win32环境(比如MinGW,Eclipse等)是会调用失败的。详细情况还是看专门的资料吧。 “JNI只能调用javah处理得到的DLL” 这个表达不是很合适,总之能被java调用的dll需要符合java的规范,不是任何dll都能被直接调用的 至于5楼提到的代码,只是在java中执行另一个进程,并不是jni。 在网上找了很多 看的晕头转向了 已经有mfc扩展dll a.dll b.dll a.lib b.lib 有没有人大概写一下在java中如何调用这些dll啊 不知道具体怎么搞啊 本来引用地址:http://www.enet.com.cn/article/2007/1029/A20071029886398.shtmlJava不是完美的,Java的不足除了体现在运行速度上要比传统的C++慢许多之外,Java无法直接访问到操作系统底层(如系统硬件等),为此Java使用native方法来扩展Java程序的功能。 可以将native方法比作Java程序同C程序的接口,其实现步骤: 1、在Java中声明native()方法,然后编译; 2、用javah产生一个.h文件; 3、写一个.cpp文件实现native导出方法,其中需要包含第二步产生的.h文件(注意其中又包含了JDK带的jni.h文件); 4、将第三步的.cpp文件编译成动态链接库文件; 5、在Java中用System.loadLibrary()方法加载第四步产生的动态链接库文件,这个native()方法就可以在Java中被访问了。 JAVA本地方法适用的情况 1.为了使用底层的主机平台的某个特性,而这个特性不能通过JAVA API访问 2.为了访问一个老的系统或者使用一个已有的库,而这个系统或这个库不是用JAVA编写的 3.为了加快程序的性能,而将一段时间敏感的代码作为本地方法实现。 首先写好JAVA文件 /* * Created on 2005-12-19 Author shaoqi */ package com.hode.hodeframework.modelupdate; public class CheckFile { public native void displayHelloWorld(); static { System.loadLibrary("test"); } public static void main(String[] args) { new CheckFile().displayHelloWorld(); } } 然后根据写好的文件编译成CLASS文件 然后在classes或bin之类的class根目录下执行javah -jni com.hode.hodeframework.modelupdate.CheckFile, 就会在根目录下得到一个com_hode_hodeframework_modelupdate_CheckFile.h的文件 然后根据头文件的内容编写com_hode_hodeframework_modelupdate_CheckFile.c文件 #include "CheckFile.h" #include #include JNIEXPORT void JNICALL Java_com_hode_hodeframework_modelupdate_CheckFile_displayHelloWorld(JNIEnv *env, jobject obj) { printf("Hello world!\n"); return; } 之后编译生成DLL文件如“test.dll”,名称与System.loadLibrary("test")中的名称一致 vc的编译方法:cl -I%java_home%\include -I%java_home%\include\win32 -LD com_hode_hodeframework_modelupdate_CheckFile.c -Fetest.dll 最后在运行时加参数-Djava.library.path=[dll存放的路径] 如果手里有VC程序的源代码最好还是重写一下函数接口,要用到JDK安装目录下 include 文件夹中的头文件。如果无源代码,或代码太多改不起,或不想改动VC的程序,可以考虑对VC写的dll用符合JNI要求的C代码包装一下再使用。 下面是一个简单的例子:运行环境为:Linux 2.6.231.编写Java代码public class Test{ public static native int invoke(int arg); static{ System.load("/home/Estelle/Workspace/Other/libTest.so"); } public static void main(String [] args){ System.out.println(invoke(1)); }}2.编译javac Test.javajavap Test3.编写c++代码#include <iostream>#include <stdlib.h>#include "Test.h"JNIEXPORT jint JNICALL Java_Test_invoke (JNIEnv * env, jclass obj, jint arg){ //Invoke your dll and return the result; return arg;}4编译成动态联接库g++ Test.cpp -fPIC -shared -o libTest.so5.运行java Test输出结果为1调用动态连接库的部分你自己实现。希望能有所帮助,windows我不是很熟悉的。 一个服务器上怎么挂2个JSP网站呢? java连接notes收发邮件,不使用smtp和pop3协议 hibernate+proxool连接池问题 求教数字的正则表达式验证问题,一经解决立即结贴散分,在线等。。。 weblogic 10 r3里 想把jdk6的编译成jdk5的 用的是ejb3.0 这样可以用吗? 中文乱码 用url传到action 关于消息驱动Bean的几个问题 能查看服务器运行的状态吗? 求救:jboss 配置问题 请问severlet有什么用?jsp都可以搞定啊? 如何创建数据库连接池? STRUTS2 循环中自变量的问题
我用过
然后就是JAVA里面去调用C了. 具体怎么调用给你个简单例子这个就是调用C的函数了.
class Test{
public int run() {
int exitVal = -1;
String path = "/../../update/update_sys";//update_sys这个就是C的函数所在路径
Runtime rt = Runtime.getRuntime();
Process proc;
try {
proc = rt.exec(path);
exitVal = proc.waitFor();// 成功返回0,失败返回-1
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return exitVal;
// System.out.println(exitVal);
}
public static void main(String args[]){
Test t = new Test();
int i = t.run();
if(i=0){
System.out.println("执行成功");
}else{
System.out.println("执行失败");
}
}
}
不好意思啊 没有结贴是因为还没有满意的答案 现在都基本结贴给分了
只剩一个我自己回了一个的帖子,给不起来分,除非强制结贴网上我也搜了很多jni的资料 有人在java里调过mfc的扩展dll吗
看到有人用jnative、jacob的 不知道这边有没有人用过 能否调用mfc的扩展dll啊
有没有人大概写一下在java中如何调用这些dll啊 不知道具体怎么搞啊
本来引用地址:http://www.enet.com.cn/article/2007/1029/A20071029886398.shtmlJava不是完美的,Java的不足除了体现在运行速度上要比传统的C++慢许多之外,Java无法直接访问到操作系统底层(如系统硬件等),为此Java使用native方法来扩展Java程序的功能。
可以将native方法比作Java程序同C程序的接口,其实现步骤:
1、在Java中声明native()方法,然后编译;
2、用javah产生一个.h文件;
3、写一个.cpp文件实现native导出方法,其中需要包含第二步产生的.h文件(注意其中又包含了JDK带的jni.h文件);
4、将第三步的.cpp文件编译成动态链接库文件;
5、在Java中用System.loadLibrary()方法加载第四步产生的动态链接库文件,这个native()方法就可以在Java中被访问了。
JAVA本地方法适用的情况
1.为了使用底层的主机平台的某个特性,而这个特性不能通过JAVA API访问
2.为了访问一个老的系统或者使用一个已有的库,而这个系统或这个库不是用JAVA编写的
3.为了加快程序的性能,而将一段时间敏感的代码作为本地方法实现。
首先写好JAVA文件
/*
* Created on 2005-12-19 Author shaoqi
*/
package com.hode.hodeframework.modelupdate;
public class CheckFile {
public native void displayHelloWorld();
static {
System.loadLibrary("test");
}
public static void main(String[] args) {
new CheckFile().displayHelloWorld();
}
} 然后根据写好的文件编译成CLASS文件
然后在classes或bin之类的class根目录下执行javah -jni com.hode.hodeframework.modelupdate.CheckFile,
就会在根目录下得到一个com_hode_hodeframework_modelupdate_CheckFile.h的文件
然后根据头文件的内容编写com_hode_hodeframework_modelupdate_CheckFile.c文件
#include "CheckFile.h"
#include
#include
JNIEXPORT void JNICALL Java_com_hode_hodeframework_modelupdate_CheckFile_displayHelloWorld(JNIEnv *env, jobject obj) {
printf("Hello world!\n");
return;
}
之后编译生成DLL文件如“test.dll”,名称与System.loadLibrary("test")中的名称一致
vc的编译方法:cl -I%java_home%\include -I%java_home%\include\win32 -LD com_hode_hodeframework_modelupdate_CheckFile.c -Fetest.dll
最后在运行时加参数-Djava.library.path=[dll存放的路径]
如果无源代码,或代码太多改不起,或不想改动VC的程序,可以考虑对VC写的dll用符合JNI要求的C代码包装一下再使用。
public static native int invoke(int arg); static{
System.load("/home/Estelle/Workspace/Other/libTest.so");
} public static void main(String [] args){
System.out.println(invoke(1));
}
}
2.编译
javac Test.java
javap Test3.编写c++代码#include <iostream>
#include <stdlib.h>
#include "Test.h"JNIEXPORT jint JNICALL Java_Test_invoke (JNIEnv * env, jclass obj, jint arg){
//Invoke your dll and return the result;
return arg;
}
4编译成动态联接库
g++ Test.cpp -fPIC -shared -o libTest.so5.运行
java Test输出结果为1
调用动态连接库的部分你自己实现。希望能有所帮助,windows我不是很熟悉的。