我已经成功生成了dll文件,但是运行到return getFileCreationTime(fileName);时报错如下 Exception in thread "main" java.lang.UnsatisfiedLinkError: cn.imu.general.MyFileTime.getFileCreationTime(Ljava/lang/String;)Ljava/lang/String; at cn.imu.general.MyFileTime.getFileCreationTime(Native Method) at cn.imu.general.MyFileTime.getCreationTime(MyFileTime.java:19) at cn.imu.general.MyFileTime.main(MyFileTime.java:23)我应该可以确认,java程序已经调用了dll文件我是按照powerlee2008 的调用方法 public final class MyFileTime { static { System.loadLibrary("MyFileTime"); } private static native String getFileCreationTime(String fileName); public static String getCreationTime(String fileName) { return getFileCreationTime(fileName); }
package cn.numen.JavaStudy;import java.io.File;
import java.io.IOException;
import java.util.Calendar;public class Test { /**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
File file =new File("D:\\test.txt");
Long time =file.lastModified();
Calendar cd = Calendar.getInstance();
cd.setTimeInMillis(time);
System.out.println(cd.getTime());
//TODO 下面的就自己写了吧
}}
的信息,应该是LZ要的吧
LZ已经知道怎么用windows的命令取得创建时间,他要的是取到秒。
lastModified()是最后一次修改时间,跟创建时间并不是同一个值啊
TO yinfei456:
取系统当前时间会有一定的误差,我也曾经想过,但感觉这不是一个好办法 :)
完全是我的意思 :)
等待高人
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class MyFileTime */#ifndef _Included_MyFileTime
#define _Included_MyFileTime
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: MyFileTime
* Method: getFileCreationTime
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_MyFileTime_getFileCreationTime
(JNIEnv *, jclass, jstring);#ifdef __cplusplus
}
#endif
#endif
#include <windows.h>
#include "MyFileTime.h"JNIEXPORT jstring JNICALL Java_MyFileTime_getFileCreationTime(JNIEnv *env, jclass cls, jstring FileName)
{
HANDLE hFile;
FILETIME creationTime;
FILETIME lastAccessTime;
FILETIME lastWriteTime;
FILETIME creationLocalTime;
SYSTEMTIME creationSystemTime;
jstring result;
char fileTimeString[30];
hFile = CreateFile((char *)env->GetStringUTFChars(FileName, 0), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if(hFile == INVALID_HANDLE_VALUE) return env->NewStringUTF("");
if(GetFileTime(hFile, &creationTime, &lastAccessTime, &lastWriteTime))
{
if(FileTimeToLocalFileTime(&creationTime, &creationLocalTime))
{
if(FileTimeToSystemTime(&creationLocalTime, &creationSystemTime))
{
sprintf(fileTimeString,
"%d.%d.%d %d:%d:%d.%d\0",
creationSystemTime.wYear,
creationSystemTime.wMonth,
creationSystemTime.wDay,
creationSystemTime.wHour,
creationSystemTime.wMinute,
creationSystemTime.wSecond,
creationSystemTime.wMilliseconds);
result = env->NewStringUTF(fileTimeString);
}
else
result = env->NewStringUTF("");
}
else
result = env->NewStringUTF("");
}
else
result = env->NewStringUTF("");
CloseHandle(hFile);
return result;
}
public final class MyFileTime {
static {
System.loadLibrary("MyFileTime");
} private static native String getFileCreationTime(String fileName); public static String getCreationTime(String fileName) {
return getFileCreationTime(fileName);
}
public static void main(String[] args) {
System.out.println(MyFileTime.getCreationTime("D:/modeldesign/MyStuff/MyFileTime.dll"));
}
}
多谢高人的回复,我不会将c代码编译成java的loadLibrary可以调用的库,望指教.
http://blog.csdn.net/sunyujia/archive/2007/10/19/1833621.aspx
#include "windows.h"
void main(int argc,char** argv){ HFILE hFile;
OFSTRUCT lp;
FILETIME creationTime;
FILETIME lastAccessTime;
FILETIME lastWriteTime;
FILETIME creationLocalTime;
SYSTEMTIME creationSystemTime;
hFile = OpenFile(argv[1],&lp, OF_READ);
if(hFile == HFILE_ERROR)
{
printf("");
return;
}
if(GetFileTime((HANDLE)hFile, &creationTime, &lastAccessTime, &lastWriteTime))
{
if(FileTimeToLocalFileTime(&creationTime, &creationLocalTime))
{
if(FileTimeToSystemTime(&creationLocalTime, &creationSystemTime))
{
printf("%d.%d.%d-%d:%d:%d.%d\0",
creationSystemTime.wYear,
creationSystemTime.wMonth,
creationSystemTime.wDay,
creationSystemTime.wHour,
creationSystemTime.wMinute,
creationSystemTime.wSecond,
creationSystemTime.wMilliseconds);
return ;
}
}
}
printf("");
return ;
}然后,Process p = Runtime.getRuntime().exec("cmd /c c:\\GetFileTime1.exe c:\\t1.txt");中再读取吧。否则怎办呢?
为方便你处理,将结果输出改为:2008.4.24-20:11:3.480 格式。另:dir命令显示的最后修改的时间,而不是创建文件的时间。以上仅供你参考。
Exception in thread "main" java.lang.UnsatisfiedLinkError: cn.imu.general.MyFileTime.getFileCreationTime(Ljava/lang/String;)Ljava/lang/String;
at cn.imu.general.MyFileTime.getFileCreationTime(Native Method)
at cn.imu.general.MyFileTime.getCreationTime(MyFileTime.java:19)
at cn.imu.general.MyFileTime.main(MyFileTime.java:23)我应该可以确认,java程序已经调用了dll文件我是按照powerlee2008 的调用方法
public final class MyFileTime {
static {
System.loadLibrary("MyFileTime");
} private static native String getFileCreationTime(String fileName); public static String getCreationTime(String fileName) {
return getFileCreationTime(fileName);
}
public static void main(String[] args) {
System.out.println(MyFileTime.getCreationTime("D:/modeldesign/MyStuff/MyFileTime.dll"));
}
}感谢sunyujia jiangnaisong :)
能否在这里再讨论下linux下的方法.解决了我再开一贴感谢