看看这个
http://www.programfan.com/article/showarticle.asp?id=1660

解决方案 »

  1.   

    网上搜索JNI。比我讲的详细多了。
    我用过
      

  2.   

    我们经常要调用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("执行失败");  
    }

    }
      

  3.   

    ls这个数据怎么看的啊 把名声搞坏了
    不好意思啊 没有结贴是因为还没有满意的答案 现在都基本结贴给分了 
    只剩一个我自己回了一个的帖子,给不起来分,除非强制结贴网上我也搜了很多jni的资料 有人在java里调过mfc的扩展dll吗
    看到有人用jnative、jacob的 不知道这边有没有人用过 能否调用mfc的扩展dll啊 
      

  4.   

    应该不能,JNI只能调用javah处理得到的DLL,如果你要调用的话,用C++封装一下,再用java调用你的C++ dll。另外在windows下请注意,你编译c程序的环境,如果不是纯win32环境(比如MinGW,Eclipse等)是会调用失败的。详细情况还是看专门的资料吧。
      

  5.   

    “JNI只能调用javah处理得到的DLL” 这个表达不是很合适,总之能被java调用的dll需要符合java的规范,不是任何dll都能被直接调用的
      

  6.   

    至于5楼提到的代码,只是在java中执行另一个进程,并不是jni。
      

  7.   

    在网上找了很多 看的晕头转向了 已经有mfc扩展dll a.dll b.dll a.lib b.lib 
    有没有人大概写一下在java中如何调用这些dll啊 不知道具体怎么搞啊
      

  8.   


    本来引用地址: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存放的路径]
      

  9.   

    如果手里有VC程序的源代码最好还是重写一下函数接口,要用到JDK安装目录下 include 文件夹中的头文件。
    如果无源代码,或代码太多改不起,或不想改动VC的程序,可以考虑对VC写的dll用符合JNI要求的C代码包装一下再使用。
      

  10.   

    下面是一个简单的例子:运行环境为: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.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我不是很熟悉的。