Java调用Dll 例子(一)

第一步,编写Java类:

注意,这个类有两个作用,一个是用来做头文件,另外一个作用就是通过它来调用dll

1,Java类

public class TestDll {
static
    { 
        System.loadLibrary("DLLSample");//载入dll
    }

    //用native关键字修饰将被其它语言实现的方法
    public native static int DoubleValue(int i);//函数声明

    public native static String pirntStr(String msg);//函数声明
    public static void main(String[] args){
        //本地方法的调用
        int rs=DoubleValue(2);
        String str=pirntStr("Hello chen!");
        System.out.println(str);
        System.out.println(rs);
    }
}

2.编译: javac TestDll
3.生成头文件: javah TestDll。生成TestDll.h

在此注意,要是TestDll类带有包名,比如dcec包,此时的javah改为 javah dcec.TestDll 进行编译。生成的.h文件也会带有包名 : dcec_TestDll.h

第二步:VC制作dll

1,新建win32 Dll项目,一个简单的dll项目即可,DLLSample工程名

2,引入第一步生成的TestDll.h。将此.h文件拷贝到DLLSample目录下。

在FileView标签中,选择Header Files右击,添加Add Files to Folders。

并在StdAfx.h中引入

#include "jni.h"
#include "jni_md.h"
#include "TestDll.h"


其中,jni.h(这个文件在JDK/include下),jni_md.h(这个文件在jdk/include/win32下)。

此处,有两种方式添加这个两个头文件:

一种是拷贝这两个文件到工程目录下,类似于将TestDll.h的方法。

另一种,在VC中 Tools->Options->Directions添加这个两个文件所在的目录,必须是直接目录,如

C:\PROGRAM FILES\JAVA\JDK1.6.0_33\INCLUDE\WIN32

C:\PROGRAM FILES\JAVA\JDK1.6.0_33\INCLUDE。

3. 实现函数。在DLLSample.cpp中添加如下代码

JNIEXPORT jint JNICALL Java_TestDll_DoubleValue (JNIEnv *, jclass, jint p)
{
    int j = p*2;
    return j;
}

JNIEXPORT jstring JNICALL Java_TestDll_pirntStr(JNIEnv *, jclass, jstring msg)
{
    return msg;
}


注意,JNIEXPORT, JNIEnv * ,jclass不要改动。在jint后添加一个自定义的形参p或其他任何变量都可以。

然后实现功能即可。

最后,编译此工程,生成DLLsample.dll文件。

第三步,运行测试

将上述生成的Dllsample.dll文件拷贝包java项目目录下(并非TestDll.class目录下,特别是带有包名的类是,应该放在包的外面),或者到C:\WINDOWS\system32目录下。

结果。。。


===========================================================

说明,以上是在vc++6.0环境下操作。

在VS2008中,采用MFC Dll工程时,注意把jni.h 和jni_md.h拷贝到工程目录下,并将#include "jni.h"  #include "jni_md.h"添加到头文件中,

而非 #include <jni.h>   #include <jni_md.h>,在这里是尖括号和双引号的区别。

而且,在用javah生成的TestDll.h中的include <jni.h>,改为#include "jni.h"。不知为何。估计我的电脑的问题。

如果直接添加目录,我的貌似不起作用。

请测试。。。。


展开阅读全文

没有更多推荐了,返回首页