Java-вызов для Windows API GetShortPathName

Я хотел бы использовать встроенную функцию Windows API в моем классе Java.

Интересующая меня функция - GetShortPathName. http://msdn.microsoft.com/en-us/library/aa364989%28VS.85%29.aspx

Я пытался использовать это -http://dolf.trieschnigg.nl/eightpointthree/eightpointthree.html но в некоторых случаях java полностью падает, когда я его использую, так что это не вариант для меня.

Вопрос в том Должен ли я писать код, например, на C, создавать DLL, а затем использовать эту DLL в JNI / JNA? А может я как-то могу получить доступ к системному API по-другому?

Буду признателен за ваши комментарии. Если бы вы могли опубликовать код в качестве примера, я был бы признателен.

...

Я нашел ответ, используя JNA



import com.sun.jna.Native;
import com.sun.jna.platform.win32.Kernel32;

public class Utils {

    public static String GetShortPathName(String path) {
        byte[] shortt = new byte[256];

        //Call CKernel32 interface to execute GetShortPathNameA method
        int a = CKernel32.INSTANCE.GetShortPathNameA(path, shortt, 256);
        String shortPath = Native.toString(shortt);
        return shortPath;

    }

    public interface CKernel32 extends Kernel32 {

        CKernel32 INSTANCE = (CKernel32) Native.loadLibrary("kernel32", CKernel32.class);

        int GetShortPathNameA(String LongName, byte[] ShortName, int BufferCount);
    }

}
 norbi77114 июн. 2012 г., 21:05
Нет никаких исключений. Я использовал это в апплете. Он работал в Firefox на моей машине, но умирал в IE. Когда я попробовал на другой машине, он даже умер в Firefox. Консоль Java просто исчезала без уведомления. Через некоторое время я смог вывести Java из строя только с консольным приложением. # # В среде выполнения Java обнаружена фатальная ошибка: # # EXCEPTION_ACCESS_VIOLATION (0xc0000005) при pc = 0x6c978775, pid = 4148, tid = 5156
 norbi77114 июн. 2012 г., 21:07
Стек: [0x0b520000,0x0b570000], sp = 0x0b56eee4, свободное пространство = 315k Собственные кадры: (J = скомпилированный код Java, j = интерпретированный, Vv = код VM, C = собственный код) V [jvm.dll + 0xa8775] C [ temp1600609646579962556.dll + 0x11d6] Java_com_eaio_nativecall_IntCall_executeCall0 + 0x162 j com.eaio.nativecall. I + 21 j Utils.getShortName (Ljava / lang / String;) Ljava / lang / String; +56
 Amir Afghani14 июн. 2012 г., 20:06
что вы имеете в виду, когда говорите «java crashes»? Можете ли вы включить в свой пост, как он падает?
 Amir Afghani14 июн. 2012 г., 22:49
JVM упал в вашей родной библиотеке.
 norbi77115 июн. 2012 г., 07:53
Что вы имеете в виду под родной библиотекой? Это сбой только когда я использовал com.eaio. .... Версия JNA не потерпела крах ... по крайней мере, до сих пор.

Ответы на вопрос(1)

Спасибо за подсказку. Следующее - моя улучшенная функция. Он использует Unicode-версию GetShortPathName

import com.sun.jna.Native;
import com.sun.jna.platform.win32.Kernel32;

public static String GetShortPathName(String path) {
    char[] result = new char[256];

    Kernel32.INSTANCE.GetShortPathName(path, result, result.length);
    return Native.toString(result);
}

Ваш ответ на вопрос