当前位置: 技术问答>java相关
问一个JNI的问题?
来源: 互联网 发布时间:2015-11-16
本文导语: 以下的代码如果不加包名,编译运行正常.如果加入包名,运行时抛出违例.各位看看是什么原因? package com... class GetSystemUsage{ private native double getCpuUsage(); public static void main(String args[]) { GetSystemUsag...
以下的代码如果不加包名,编译运行正常.如果加入包名,运行时抛出违例.各位看看是什么原因?
package com...
class GetSystemUsage{
private native double getCpuUsage();
public static void main(String args[]) {
GetSystemUsage g = new GetSystemUsage();
double usage = g.getCpuUsage();
System.out.println("usage: " + usage);
}
static {
System.loadLibrary("ImpOfCPU");
}
}
#include
#include "GetSystemUsage.h"
#include
#include
JNIEXPORT jdouble JNICALL Java_GetSystemUsage_getCpuUsage
(JNIEnv *env, jobject obj)
{....
}
package com...
class GetSystemUsage{
private native double getCpuUsage();
public static void main(String args[]) {
GetSystemUsage g = new GetSystemUsage();
double usage = g.getCpuUsage();
System.out.println("usage: " + usage);
}
static {
System.loadLibrary("ImpOfCPU");
}
}
#include
#include "GetSystemUsage.h"
#include
#include
JNIEXPORT jdouble JNICALL Java_GetSystemUsage_getCpuUsage
(JNIEnv *env, jobject obj)
{....
}
|
呵呵,说来说去有碰到包名的问题了。
这和java编译器寻找包的机制有关,在命令提示行窗口编译一个java文件可以不需要指出包的路径,在该文件的当前文件路径下进行编译就可以了。但是当你要运行它,就必须退到你包的路径的上一级进行运行(敲入java 包名.文件名)才可以,当然也可以设置classpath来解决这个问题。
不过在jni中,这只是其中的一个问题,如果你在使用javah生成.h文件时,没有在包名上一级来编译.h文件,也能成功,但在运行的时候就会出错,在.h文件中可以看见相应的信息,这点也是要注意的。
你的违例就是找不到dll文件出错,你可以根据我的意见再试试。谢谢。
这和java编译器寻找包的机制有关,在命令提示行窗口编译一个java文件可以不需要指出包的路径,在该文件的当前文件路径下进行编译就可以了。但是当你要运行它,就必须退到你包的路径的上一级进行运行(敲入java 包名.文件名)才可以,当然也可以设置classpath来解决这个问题。
不过在jni中,这只是其中的一个问题,如果你在使用javah生成.h文件时,没有在包名上一级来编译.h文件,也能成功,但在运行的时候就会出错,在.h文件中可以看见相应的信息,这点也是要注意的。
你的违例就是找不到dll文件出错,你可以根据我的意见再试试。谢谢。
|
简单,加上包名后重新生成.h文件,再重新编译你的DLL,就好了。
|
java 包名.文件名