用Visual Studio如何生成dll文件

godhammer 2006-07-19 11:13:28

最近在了解jni,对C++的知识了解的比较少,想问下如何生成一个dll文件,看到很多网上说,写个.h,.cpp,然后编译连接成库文件,就生成dll了,但是如何编译连接成库文件,是怎么操作的,那位高手指点一下。最好能给个详细的操作步骤,谢谢。

还有想问一下,生成一个简单的.dll文件是需要一个项目,还是仅需要一个.cpp就可以生成了。
...全文
8099 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
godhammer 2006-09-01
  • 打赏
  • 举报
回复
谢谢大家,OK了,
sankt 2006-07-21
  • 打赏
  • 举报
回复
http://soft.yesky.com/lesson/318/2166818.shtml
sankt 2006-07-21
  • 打赏
  • 举报
回复
vc6.0有工程向导的
你选择win32 dynamic-link library就ok了
jixingzhong 2006-07-21
  • 打赏
  • 举报
回复
【引用】 这个是以前参考的资料, 也提供给楼主看看吧:

简单介绍及应用如下:
一、JAVA中所需要做的工作
在JAVA程序中,首先需要在类中声明所调用的库名称,如下:
static {
System.loadLibrary(“goodluck”);
}

在这里,库的扩展名字可以不用写出来,究竟是DLL还是SO,由系统自己判断。
还需要对将要调用的方法做本地声明,关键字为native。并且只需要声明,而不需要具 体实现。如下:
public native static void set(int i);
public native static int get();
然后编译该JAVA程序文件,生成CLASS,再用JAVAH命令,JNI就会生成C/C++的头文件。
例如程序testdll.java,内容为:
public class testdll
{
static
{
System.loadLibrary("goodluck");
}
public native static int get();
public native static void set(int i);
public static void main(String[] args)
{
testdll test = new testdll();
test.set(10);
System.out.println(test.get());
}
}

用javac testdll.java编译它,会生成testdll.class。
再用javah testdll,则会在当前目录下生成testdll.h文件,这个文件需要被C/C++程序调用来生成所需的库文件。
二、C/C++中所需要做的工作
对于已生成的.h头文件,C/C++所需要做的,就是把它的各个方法具体的实现。然后编译连接成库文件即可。再把库文件拷贝到JAVA程序的路径下面,就可以用JAVA调用C/C++所实现的功能了。
接上例子。我们先看一下testdll.h文件的内容:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class testdll */
#ifndef _Included_testdll
#define _Included_testdll
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: testdll
* Method: get
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass);
/*
* Class: testdll
* Method: set
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint);
#ifdef __cplusplus
}
#endif
#endif
在具体实现的时候,我们只关心两个函数原型
JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass); 和
JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint);
这里JNIEXPORT和JNICALL都是JNI的关键字,表示此函数是要被JNI调用的。而jint是以JNI为中介使JAVA的int类型与本地的int沟通的一种类型,我们可以视而不见,就当做int使用。函数的名称是JAVA_再加上java程序的package路径再加函数名组成的。参数中,我们也只需要关心在JAVA程序中存在的参数,至于JNIEnv*和jclass我们一般没有必要去碰它。
好,下面我们用testdll.cpp文件具体实现这两个函数:
#include "testdll.h"
int i = 0;
JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass)
{
return i;
}
JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint j)
{
i = j;
}
编译连接成库文件,本例是在WINDOWS下做的,生成的是DLL文件。并且名称要与JAVA中需要调用的一致,这里就是goodluck.dll 。把goodluck.dll拷贝到testdll.class的目录下,java testdll运行它,就可以观察到结果了。
jixingzhong 2006-07-21
  • 打赏
  • 举报
回复
忘了说一点,
有两个 用到的 jni 头文件从 jdk 的include 文件夹下拷贝出来就可以了,
分别是: jni.h 和 include 下的 win32\jni_md.h
拷贝到工程目录下 ....
jixingzhong 2006-07-21
  • 打赏
  • 举报
回复
几个需要注意的地方:

1 不要使用任何其他资源,如 mfc;
2 建立的是 dll 工程, 注意是空的,即原来不能有其他文件存在
3 那个 通过 javah 获得的 .h 文件不要有任何的修改,否则可能 jni 调用时候会出错
jixingzhong 2006-07-21
  • 打赏
  • 举报
回复
命令行方式毕竟不方便,
这里给出几个比较好的方案吧,
也是我曾经使用的方案:

建立 dll 空工程,没有任何文件,
(这么做就可以使得编译后的到的是 dll, 而不是 exe, 注意一些选项的选择)
然后吧你的 .h 文件添加到这个工程中来,
(因为 .h 是根据 java 程序用 javah 命令生成的)
再在工程中写一个 cpp 实现 .h 中的函数,
编译后即可 得到需要的 dll 了 ....

使用工程,
1 是比较方便,
2 是在调试的时候也方便,可以查看一些东西 ...
jixingzhong 2006-07-21
  • 打赏
  • 举报
回复
只是单独 源码 cpp 文件生成你需要的 dll 也是可以的,
这样的话就需要用 命令行方式:

如:
#include "Test1.h"
JNIEXPORT jint JNICALL Java_Test1_sum( JNIEnv *env, jclass clazz, jint op1, jint op2 ) {
jint sum = op1+op2;
return sum;
}
然后利用VC编译器:生成java的dll.如:
cl -Ic:\jdk1.1.6\include -Ic:\jdk1.1.6\include\win32 -LD TEST1.CPP -FeTEST.dll
注意这个 jdk 的路径是你自己的jdk 路径(版本可能也不一样)
jixingzhong 2006-07-21
  • 打赏
  • 举报
回复
VS 中写 DLL 最好是用 项目,
那么写了代码后直接编译就可以的到你要的 dll 了 ~~
Bible_Chou 2006-07-21
  • 打赏
  • 举报
回复
工程选择win32
钩上dll
后面的就和一般的C/C++一样了.
可以在def中定义导出函数或者在定义函数的时候申明__declspec(export)......
hhyytt 2006-07-21
  • 打赏
  • 举报
回复
vc6.0有工程向导的
你选择win32 dynamic-link library
再看代码。
femalelover 2006-07-20
  • 打赏
  • 举报
回复
没看懂
PS.楼主可以用VS的DLL向导生成一个DLL文件,然后看向导生成的源代码就是了.
OOPhaisky 2006-07-19
  • 打赏
  • 举报
回复
学习
vsfan 2006-07-19
  • 打赏
  • 举报
回复
这是我转的一篇好文

最近项目中设计到JNI的技术,对于VC++我是一知半解.JNI是知道和Native方法的接口,从来
没用过.但是摸了一会,还是感觉有点门路,搞定了JNI的难题以后,对于自己这点小小的进步
不敢隐瞒,公开出来给还不了解的兄弟们作个参考.


1 编写范例文档
public class TestNative{

private native int add(int x,int y);

public static void main(String[] args) {
TestNative hh = new TestNative();
int r = hh.add(30,20);
System.out.println("result = "+r);
}

static {
System.loadLibrary("DLL_0305");
}
}
其中
LoadLibrary中的DLL文件名称可以随便定.只要做好的动态链接库改名成这个字符串就可以
了.而native函数的来源就是该动态链接库.
2. 做好该步准备以后,用javac TestNative.java生成.class.检验语法.
3. 语法检查通过以后,用javah TestNative生成.h的C头文件.
4. 打开VC++6.0,新建->; 工程 ->; win32 Dynamic-Link Library .在向导中选择空工程
.
5. 把刚才javah生成的那个头文件加入工程 .然后 文件->;新建->;textFile 自己做一个
.c文件.实现自己的native函数.清单如下:

#include<jni.h>;

JNIEXPORT jint JNICALL Java_TestNative_add
(JNIEnv *ev, jobject obj, jint x, jint y)
{
return x+y;
}
备注:
A 其中的jni.h通常在 jdk\include\ 可以先拷贝到VC安装目录下的include目录下.一劳
永逸,以后可以方便使用JNI技术.
B 全部的数据类型需要考虑Java和VC的接口问题.用jint jstring 等.
C 函数名称和自动生成的.h文件中规定的一致.命名规则是: Java_使用类_方法名
6 全编译一下工程.
如果没有出错,则此时生成动态链接库成功.
把动态链接库拷贝到TestNative.java所在的目录上.
7 运行java TestNative看结果吧.

64,662

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧