JNI的制作和调用流程

来源:互联网 发布:js脚本 调用 c dll 编辑:程序博客网 时间:2024/05/17 07:27

1.写一个java类,该类包含了需要调用的本地方法的描述,如:

package com.jose

public class Test {

      public native long method1(String mess);

   public native long method2(String mess);

   static {

       System.loadLibrary("TestImp");

   }

}

其中TestImp.dl文件放在windows安装目录的system32下面,同时设置好classpath(.)

注意:一般情况下java类有放在包里和没有包两种情况。

2.提示符下使用命令javac -d . Test.java 编译上面写的java文件。

此时会生成相应的包的目录结构,并生成Test.class文件。

3.提示符下使用命令javah -jni com_jose_Test,此时会在当前目录下生成文件com_jose.Test.h文件,该文件是由包名+类名组成,中间用分隔符(_)隔开。

4.使用VC来编写本地方法的实现函数,最后编译成.dll文件

①选择new->projects(选择Win32 Dynamic-Link Library,以第一步中指定的库名TestImp作为工程名)->OK->An ampty DLL project->Finish

②选择Tools->Options->Directories 添加JNI所需的头文件

③将第三步生成的com_jose_test.h文件拷贝到TestImp工程中,并将其添加到TestImp.cpp的头文件中

注意事项说明:

 ㈠我们知道DLL有两种导出函数的方法,一种就是在.def文件中定义,另一种是在定义函数时使用关键字_declspec(dllexport)。而在JNI中函数定义关键字JNIEXPORT实际就在jni_md.h中如下定义:

#define JNIEXPORT_declspec(dllexport)

可见JNI默认的导出方式为第二种。使用第二种方式产生的导出函数名会根据编译器发生变化,在有的情况下会发生找不到导出函数的问题(我们在JSP中调用JNI的时候就发生这样的问题,后来强加一个.def文件重新导出函数就解决了)。因此最好还是自己定义个.def文件,强制导出的方法比较好点。

 ㈡根据本列,写一个TestImp.def文件,如下:

LIBRARY "TestImp"

DESCRIPTION  'ImageConvertDll Windows Dynamic Link Library'

EXPORTS;

Explicit exports can go here

Java_com_jose_Test_method1

Java_com_jose_Test_method2

 

最后生成dll文件

 

原创粉丝点击