两个Java文件在一个JVM中,可否访问同一个动态链接库?

虎叔 2002-12-03 12:45:28
两个Java文件在一个JVM中,可否访问同一个动态链接库
...全文
43 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
elabs 2002-12-06
  • 打赏
  • 举报
回复
实在懒得写两遍,只能在C下 a函数调用b函数。就省得写这么多了。
elabs 2002-12-06
  • 打赏
  • 举报
回复
实际上,你通过JNI不可能产生不同类,而生成相同的头定义,即使你在两个类中定义相同的函数名,导出的函数名也不同,不同包也是如此,自己注意看一下头的函数名称。

不然JAVA通过什么去DLL中找函数地址啊。
虎叔 2002-12-05
  • 打赏
  • 举报
回复
To elabs(洋洋) :
可是你说的办法是两个java文件用同一个动态库中的不同函数,
如果我想用同一个动态库中的同一个函数有办法没?我总不至于
把同一个函数就头改一下写两遍吧?太土了。
不过你说的也是一个解决办法,先给一半分吧,如果都解决了再给另外一半。
elabs 2002-12-05
  • 打赏
  • 举报
回复
你说的可能不可行,因为你仔细看看就知道,从JAVA中倒出的函数和JAVA中的类名和包名有关,掉用的时候JAVA 应该是根据这个去调用函数,所以可能只能如此了.
313fxq 2002-12-05
  • 打赏
  • 举报
回复
写的很详细啊。关注这个问题。
HelloWorldd 2002-12-05
  • 打赏
  • 举报
回复
关注
elabs 2002-12-05
  • 打赏
  • 举报
回复
等着接分了
elabs 2002-12-05
  • 打赏
  • 举报
回复
给你写了个例子:

这个是a.java
class a
{
static
{
try
{
System.loadLibrary("a");
}
catch(Exception e)
{
System.out.println(e);
}
}
public static void main(String args[])
{
a m = new a();
System.out.println(m.s(123));
b o = new b();
System.out.println(o.ss(567));
}
native public int s(int a);
}

这个是b.java

class b
{
native public int ss(int a);
}

这个是a.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class a */

#ifndef _Included_a
#define _Included_a
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: a
* Method: s
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_a_s
(JNIEnv *, jobject, jint);

#ifdef __cplusplus
}
#endif
#endif

这个是b.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class b */

#ifndef _Included_b
#define _Included_b
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: b
* Method: ss
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_b_ss
(JNIEnv *, jobject, jint);

#ifdef __cplusplus
}
#endif
#endif

这个是我修改后的 a.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class a */

#ifndef _Included_a
#define _Included_a
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: a
* Method: s
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_a_s
(JNIEnv *, jobject, jint);

JNIEXPORT jint JNICALL Java_b_ss
(JNIEnv *, jobject, jint);

#ifdef __cplusplus
}
#endif
#endif

这个是a.cpp

#include "a.h"


JNIEXPORT jint JNICALL Java_a_s
(JNIEnv *, jobject, jint)
{
return 999;
}



JNIEXPORT jint JNICALL Java_b_ss
(JNIEnv *, jobject, jint)
{
return 888;
}

用这个命令编译:

cl -ID:\jdk1.4\include -ID:\jdk1.4\include\win32 -LD a.cpp -Fea.dll

运行java a

就可以看到效果了。
elabs 2002-12-05
  • 打赏
  • 举报
回复
你可以把两个JAVA程序编译出来的头和为一个啊

就是把每个函数口放到一个文件下
虎叔 2002-12-03
  • 打赏
  • 举报
回复
是啊,想通过jni去访问一个c的动态库(自己写的),
可是不是先要编译.H文件吗?两个java文件用一个动态库该怎么办?
elabs 2002-12-03
  • 打赏
  • 举报
回复
应该没问题的。是不是想通过JNI去访问C++代码,而且想把C++其中封装在一个动态库中。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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