java jni 例子

以前一直关注这个但是一直没有跑出来一个例子, 后来在朋友的问题中找到了这个网页

转载:http://pet.iteye.com/blog/188313 终于明白了jni的用处了。呵呵!

Java获得文件创建时间

最近被文件创建时间搞的很郁闷,在CSDN和Javaeye上发贴问了很多高人,感慨跨平台的东西不一定就是最实用的.一个小小的时间字符串就要这么麻烦.
Java的File类只提供了一个获取文件最后一次修改时间的方法 lastModified().官方API中描述为"返回此抽象路径名表示的文件最后一次被修改的时间."
听听来自CSDN的声音:
  1. "UNIX或LINUX平台下文件系统中就没有保存文件的创建时间,只有文件的最后修改的时间。否则的话,JAVA中File类就应该有支持这个属性的方法了."
  2. "在Linux中,没有文件创建时间的概念.只有文件的访问时间、修改时间、状态改变时间.也就是说不能知道文件的创建时间."
  3. "若LINUX下文件创建好以后全是文件读操作(没有执行过存盘操作),则取的文件修改时间就是文件创建的时间."
  4. "我想在LINUX下,就以修改时间为你的文件时间.如:只要不改文件就行. 方法:如要获取文件mydata.dat,则: 命令:ls --full-time mydata.dat 显示结果:-rw-r--r-- 1 root root 0 2008-04-26 22:47:50.000000000 +0800 mydata.dat 上边红色的就是你要的.你就用JAVA直接取吧.上述ls命令外,用的是最后修改时间,倒不如直接用JAVA的File类取最后修改时间了"


基于以上讨论,下面方法仅限于Windows平台.
通过Java JNI取得文件创建时间.需要用到VC++6.0.
[list]

  • 在VC中创建一个Win32 Dynamic-Link Library工程MyFileTime
  • 添加头文件MyFileTime.h,内容为
    C代码 复制代码  收藏代码
    1. #include <jni.h>   
    2. /* Header for class MyFileTime */  
    3.   
    4. #ifndef _Included_MyFileTime   
    5. #define _Included_MyFileTime   
    6. #ifdef __cplusplus   
    7. extern "C" {   
    8. #endif   
    9. /*  
    10.  * Class:     MyFileTime  
    11.  * Method:    getFileCreationTime  
    12.  * Signature: (Ljava/lang/String;)Ljava/lang/String;  
    13.  */  
    14. JNIEXPORT jstring JNICALL Java_cn_imu_jni_MyFileTimegetFileCreationTime   
    15.   (JNIEnv *, jobject, jstring);   
    16.   
    17. #ifdef __cplusplus   
    18. }   
    19. #endif   
    20. #endif  
  • 添加C++类文件MyFileTime.cpp,内容为
    C代码 复制代码  收藏代码
    1. #include <windows.h>   
    2. #include "MyFileTime.h"   
    3.   
    4. JNIEXPORT jstring JNICALL Java_cn_imu_jni_MyFileTime_getFileCreationTime(JNIEnv *env, jobject cls, jstring FileName)   
    5. {   
    6.     HANDLE hFile;   
    7.     FILETIME creationTime;   
    8.     FILETIME lastAccessTime;   
    9.     FILETIME lastWriteTime;   
    10.     FILETIME creationLocalTime;   
    11.     SYSTEMTIME creationSystemTime;   
    12.     jstring result;   
    13.     char fileTimeString[30];   
    14.        
    15.     hFile = CreateFile((char *)env->GetStringUTFChars(FileName, 0), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);   
    16.     if(hFile == INVALID_HANDLE_VALUE) return env->NewStringUTF("");   
    17.     if(GetFileTime(hFile, &creationTime, &lastAccessTime, &lastWriteTime))   
    18.     {   
    19.         if(FileTimeToLocalFileTime(&creationTime, &creationLocalTime))   
    20.         {   
    21.             if(FileTimeToSystemTime(&creationLocalTime, &creationSystemTime))   
    22.             {   
    23.                 sprintf(fileTimeString,    
    24.                     "%04d-%02d-%02d %02d:%02d:%02d/0",    
    25.                         creationSystemTime.wYear,    
    26.                         creationSystemTime.wMonth,    
    27.                         creationSystemTime.wDay,    
    28.                         creationSystemTime.wHour,    
    29.                         creationSystemTime.wMinute,    
    30.                         creationSystemTime.wSecond);   
    31.                 result = env->NewStringUTF(fileTimeString);   
    32.             }   
    33.             else  
    34.                 result = env->NewStringUTF("");   
    35.         }   
    36.         else  
    37.             result = env->NewStringUTF("");   
    38.     }   
    39.     else  
    40.         result = env->NewStringUTF("");   
    41.     CloseHandle(hFile);   
    42.     return result;   
    43. }  
  • 编译工程,生成MyFileTime.dll文件
  • 在Java项目的cn.imu.jni包中添加类MyFileTime,内容为
    Java代码 复制代码  收藏代码
    1. package cn.imu.jni;   
    2.   
    3. public final class MyFileTime {   
    4.     /**  
    5.      * @param args  
    6.      */  
    7.     static {   
    8.         System.loadLibrary("MyFileTime");   
    9.     }   
    10.     private static native String getFileCreationTime(String fileName);   
    11.     public static String getCreationTime(String fileName) {   
    12.         return getFileCreationTime(fileName);   
    13.     }   
    14.     public static void main(String[] args) {   
    15.         System.out.println(MyFileTime.getCreationTime("c:/db.txt"));   
    16.     }   
    17. }  
    package cn.imu.jni;
    
    public final class MyFileTime {
    	/**
    	 * @param args
    	 */
    	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("c:/db.txt"));
        }
    }

    [/list]
    注意:
    • 头文件和类文件中的方法名中cn_imu_jni_MyFileTime字符串对应Java项目中的cn.imu.jni.MyFileTime,若包和类名不同,在C++代码中需要相应的更改.
    • 如果在VC++中编译时遇到缺少jni.h和jni_md.h,可以在%JAVA_HOME%/include和%JAVA_HOME%/include/win32目录中找到,copy到Microsoft Visual Studio/VC98/Include目录中或放到VC能找到的classpath即可.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值