关于JNI技术使用C的动态连接库

dgsrest 2003-12-17 04:27:20
Java中的JNI技术可以使用C的动态连接库,比如printf()但是我自己编写的动态连接库按JNI技术,不知道为什么通不过,
我的dll中有函数FXX或者同时有_FXX
但是连接时候,出现错误,总是说HelloWorld.obj : error LNK2001: unresolved
external symbol __imp__FXX,
不知道为什么
1.所以我想知道:JNI中能不能调用自己写的动态库
2.为什么JNI中能调用C的库,C的库到底是不是动态库,我如何才能构造一个和C库一样的库?
...全文
92 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
207 2003-12-17
  • 打赏
  • 举报
回复
这个用java实现我想应该比较困难吧,不过我还没有尝试过 :P
但是你若是只是希望看看java程序自己进程内得一些信息还是可以的,但如果要想vc那样看到所有进程得信息,必须通过jni了,利用vc中得CreateToolHelp32Snapshot函数,可以看到系统所有进程了。
dgsrest 2003-12-17
  • 打赏
  • 举报
回复
谢谢207兄,还有个问题:
我做一个程序,想看机器上运行的java进程的状态, 有什么办法可以实现呢?还是用jni吗?
Diego2000 2003-12-17
  • 打赏
  • 举报
回复
有意思
207 2003-12-17
  • 打赏
  • 举报
回复
E:\>javac DisplayMessage.java

E:\>javah DisplayMessage

vc++6.0-->win32dll-->c++file
#include <stdio.h>
#include "DisplayMessage.h"
JNIEXPORT void JNICALL Java_DisplayMessage_printMessage
(JNIEnv *env, jclass cl)
{
printf("hello!boy!");
}

tools-->option-->jdkhome\include\jni.h

build jnitest.dll

E:\>java DisplayMessage
Exception in thread "main" java.lang.UnsatisfiedLinkError: printMessage
at DisplayMessage.printMessage(Native Method)
at DisplayMessage.main(DisplayMessage.java:4)

modify DisplayMessage.java
public class DisplayMessage {
static {
∶ System.loadLibrary("jnitest");
}
public static void main(String[] args) {
printMessage();
}
public static native void printMessage();
}

E:\>java DisplayMessage
Exception in thread "main" java.lang.UnsatisfiedLinkError: no jnitest in jav
a.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1410)
at java.lang.Runtime.loadLibrary0(Runtime.java:772)
at java.lang.System.loadLibrary(System.java:832)
at DisplayMessage.<clinit>(DisplayMessage.java:4)

∶E:\>set path=%path%;d:\jnitest\debug

E:\>java DisplayMessage
hello!boy!
207 2003-12-17
  • 打赏
  • 举报
回复
转载于--水木清华bbs
JNI(JAVA NATIVE INTERFACE,JAVA本地接口)
是JAVA在特殊情况下,(如强调效率或与平台
有关的功能)必须调用本地方法时的接口规则。
下面是一个无限简单的样例:
程序功能:用JAVA调用本地用VC写的一个函数,
该函数输入一个整数,输出整数的平方加3。
1、首先,建立自己的JAVA主程序jnitest.java
jnitest.java :

import java.lang.*;
public class jnitest {
public static void main(String args[]) {
jnitest Mytest = new jnitest();
int a = 4;
int b = Mytest.Cal(a);
System.out.println("The result is : "+b);
}

public native int Cal(int i) ;

static {
System.loadLibrary("MyCal");
// MyCal 是本地方法的动态链接库的名称
}
}

2、然后javac jnitest.java ,生成.CLASS文件。
3、然后javah -jni jnitest , 生成jnitest.h。
编辑jnitest.h ,找到JAVA定义的本地方法的原型:

JNIEXPORT jint JNICALL Java_jnitest_Cal
(JNIEnv *, jobject, jint)

4、根据函数原形,编写C函数如下:
#include "jni.h"
#include "jnitest.h"

JNIEXPORT jint JNICALL Java_jnitest_Cal
(JNIEnv *env, jobject obj, jint a)
{
return ( a * a + 3) ;
}

注意必须INCLUDE 生成的jnitest.h和JAVA自带的jni.h
用VC编译之,生成MyCal.dll。
5、将MyCal.dll拷贝到jnitest所在目录,运行 :
java jnitest

结果为:The result is :19

62,614

社区成员

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

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