恩?
我现在有一个现成的dll.
那java中就不能调用了??

解决方案 »

  1.   

    现成的DLL,JAVA不能直接调用,里边没有JAVA的导出声明
    使用现有的DLL的话,你可以自己建立DLL工程,在这个工程里边导入你的DLL,声明要这个工程里使用的该DLL的导出函数,同时把你JAVA中生成.h头文件导入,实现.h头文件中的导出函数,在这个导出函数里边,你就可以使用你本地DLL导入的函数。
      

  2.   

    << 看了论坛中的其他帖子,好象jni调用的例子大都是 xx.java 然后用javah编译成.h 然后出来.c 然后生成dll. 就是在.c中实现对dll中的方法的调用。
    是吗?我刚刚接触jni,项目又比较急,能给一些代码吗?
      

  3.   

    你是指java调用系统dll或者非java导出格式的那种dll 的例子?
    如果是直接JAVA调用自己写的包含JAVA标准导出函数的dll,网上例子很多调用其他dll 的我抽空给你写一个
      

  4.   

    C语言如何调用DLL你应该知道吧,你就用Java调用你自己的JNI,JNI去掉用你已经有的DLL
      

  5.   

    to :  fast_time(fast_time) < 你就用Java调用你自己的JNI,JNI去掉用你已经有的DLL关键是我现在只有一个dll , 这个时候,怎么写自己的jni呢?
      

  6.   

    写了个简单的调用,楼主可以自行修改,编译器用VC6+SP6
    JAVA调用JNITest这个含有JAVA标准导出格式的DLL,JNITest.dll又去调用一个非JAVA标准导出格式的DLL--MyTestJNI.dll,当然这个dll可以换成系统dll
    -----------------------------------------------------------------------
    JAVA 文件:
    //MsgBox.java
    package jnitest;
    public class MsgBox  
    {
    static{
    System.loadLibrary("JNITest");    
    }
    public native void showMsgBox(int n);  
    }//TestJNI.java
    import jnitest.MsgBox;
    public class TestJNI 
    {
    public static void main(String[] args) 
    {
    MsgBox box = new MsgBox();
    box.showMsgBox(10);
    }
    }编译成功后, 运行
    javah jnitest.MsgBox 生成 C头文件 jnitest_MsgBox.h //jnitest_MsgBox.h
    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class jnitest_MsgBox */#ifndef _Included_jnitest_MsgBox
    #define _Included_jnitest_MsgBox
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     jnitest_MsgBox
     * Method:    showMsgBox
     * Signature: (I)V
     */
    JNIEXPORT void JNICALL Java_jnitest_MsgBox_showMsgBox
      (JNIEnv *, jobject, jint);#ifdef __cplusplus
    }
    #endif
    #endif------------------------------------------------------------------------然后建立VC工程,准备生成MyTestJNI.dll
    这里用一个最简单的计算函数示例吧,它求出一个整数的平方
    //myFun.h
    #ifndef __MYFUN_H_INCLUDE
    #define __MYFUN_H_INCLUDE#ifdef __cplusplus
    extern "C"
    {
    #endif //__cplusplus//示例函数,计算整数的平方__declspec(dllexport) int mySQRT(int n);#ifdef __cplusplus
    }
    #endif //__cplusplus#endif //__MYFUN_H_INCLUDE-----------------------------------------------------------------------// MyTestJNI.cpp : Defines the entry point for the DLL application.
    //#include "stdafx.h"
    #include "myFun.h"BOOL APIENTRY DllMain( HANDLE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
     )
    {
        return TRUE;
    }
    __declspec(dllexport) int mySQRT(int n)
    {
    return n*n;
    }编译生成MyTestJNI.dll和MyTestJNI.lib然后建立包含JAVA标准导出函数的DLL文件JNITest.dll
    ------------------------------------------------------------------------
    把jnitest_MsgBox.h添加到自己的DLL工程中,同时把上步生成的MyTestJNI.dll和MyTestJNI.lib复制到当前工程Debug目录下,然后编辑JNITest.cpp:// JNITest.cpp : Defines the entry point for the DLL application.
    //#include "stdafx.h"
    #include "jnitest_MsgBox.h"//声明导出函数,底下导入MyTestJNI到此工程
    extern "C" __declspec(dllexport) int mySQRT(int n); 
    #pragma comment(lib,"debug/MyTestJNI")BOOL APIENTRY DllMain( HANDLE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
     )
    {
        return TRUE;
    }
    JNIEXPORT void JNICALL Java_jnitest_MsgBox_showMsgBox
    (JNIEnv * env, jobject obj, jint n){
    int m=(int)n;
    int d=mySQRT(m);   //调用该MyTestJNI.dll中的mySQRT函数
    char* str=new char[20];
    sprintf(str,"平方是 %d",d);
    MessageBox(NULL,str,"Java 调用",MB_OK);
    delete str;
    }//////////////////////////////////////////////////////////
    编译当前工程生成JNITest.dll至此,两个DLL均生成完毕,复制两个DLL文件到JAVA文件所在目录,运行
    java TestJNI 是不是看到对话框,平方是100 OK,这只是个简单的例子,楼主可自行修改MyTestJNI DLL工程里的函数以实现一些底层操作。吃饭~~~
      

  7.   

    一个小BUG,当然编译不会出错,但是会造成内存泄漏,呵呵
    delete str ==> delete[] str;
    ...
    JNIEXPORT void JNICALL Java_jnitest_MsgBox_showMsgBox
    (JNIEnv * env, jobject obj, jint n){
    int m=(int)n;
    int d=mySQRT(m);   //调用该MyTestJNI.dll中的mySQRT函数
    char* str=new char[20];
    sprintf(str,"平方是 %d",d);
    MessageBox(NULL,str,"Java 调用",MB_OK);

             //delete str; 
             delete[] str;
    }
      

  8.   


    我做最后的dll时,
    怎么提示“jni.h”文件找不到,
    我已经把jdk下的jni.h  copy到对应的目录了啊。急
      

  9.   

    呵呵。上面的问题解决了。
    例子也运行成功了。但是,现在又新的问题:
    因为在生成dll的时候,有对应的.lib文件,所以,#pragma comment(lib,"debug/MyTestJNI")不会有问题.而我现在只有一个dll,和一个对应的ini文件.
    如何vc++中引用没有lib的 dll.