2017-10-10 123 views
1

我想打電話給Linux的使用JNA在Java安裝命令,並將調用結果填充的掛載點列表,但無法理解應該是什麼實際的返回類型的Linux命令的輸出爲接口方法。如何讀取使用JNA

如果我使用int,那麼它打印-1沒有任何錯誤。我認爲這是某種錯誤的表現。

public class MountTest { 

private interface CLibrary extends Library { 
    String[] mount(); 
} 

public static void main(String[] args) { 
    CLibrary INSTANCE = (CLibrary) Native.loadLibrary("c", CLibrary.class); 

    System.out.println(INSTANCE.mount()); 
} 

}

我試圖根據以下DOC但沒有任何工程使用不同的返回類型。

Default Type Mappings

我想我的問題是基於

My library sometimes causes a VM crash不正確的簽名:仔細檢查方法的簽名導致崩潰,以確保所有參數都是合適的尺寸和類型。對本地指針變化要特別小心。另請參閱有關調試結構定義的信息。

任何人都可以幫助我解決這個問題。我應該使用哪種返回類型,以便可以訪問掛載點列表。

更新: 我能夠通過調整代碼如下運行Linux命令:

public class MountTest { 

private interface CLibrary extends Library { 
    CLibrary INSTANCE = (CLibrary) Native.loadLibrary("c", CLibrary.class); 
    int runCommand(String cmd); 
} 

public static void main(String[] args) { 
    CLibrary.INSTANCE.runCommand("mount"); 
} 

}

現在的問題是,它的打印到標準輸出。我不知道如何閱讀使用JNA

+0

如何直接調用安裝功能,使用JNA,看着它的返回值(int)來確定它是否成功:http://man7.org/linux/man-pages/man2/mount.2.html – kvr

+0

我想要的是所有當前連接的文件系統的列表,它實際上是已知掛載點列表。在這種情況下,我不會回報價值 – Vahid

回答

0

標準輸出結果通過mount文檔

安裝()通過附加源中指定的文件系統(通常是一個 路徑指到一個設備,但可也是 目錄或文件的路徑名,或者是一個虛擬字符串)到目標路徑名指定的位置(目錄或 文件)。

這意味着mount系統調用只是掛載目錄,它不同於the mount command。您可能正在尋找getmetent,它會列出所有你的文件系統掛載點,波紋管一實現:

public interface CLibrary extends Library { 
    CLibrary INSTANCE = (CLibrary) Native.loadLibrary("c", CLibrary.class); 
    Pointer fopen(String name, String mode); 
    Mount.ByReference getmntent(Pointer FILE); 
} 

public static void main(String[] args) { 
    final Pointer mountFile = CLibrary.INSTANCE.fopen("/etc/mtab", "r"); 
    if (mountFile == null) { 
     System.err.println("File not exists: " + mountFile); 
     return; 
    } 
    Mount.ByReference mpoint; 
    while ((mpoint = CLibrary.INSTANCE.getmntent(mountFile)) != null) { 
     System.out.println(mpoint); 
    } 

} 

public static class Mount extends Structure { 
    public String mnt_fsname; 
    public String mnt_dir; 
    public String mnt_type; 
    public String mnt_opts; 
    public int mnt_freq; 
    public int mnt_passno; 

    @Override 
    protected List getFieldOrder() { 
     List<String> fieds = new ArrayList<>(); 
     for (final Field f : Mount.class.getDeclaredFields()) { 
      if (!f.isSynthetic()) 
       fieds.add(f.getName()); 
     } 
     return fieds; 
    } 

    public static class ByReference extends Mount implements Structure.ByReference { 
    } 
} 

觀測數據:據我所知,你不能把從JNA編譯的程序,只是庫函數和系統調用,然後是不可能調用安裝命令,如果你真的想要使用這個命令,那麼你可能想要使用Runtime.getRuntime().exec或類似的東西。


更新

看看this answer那裏你可以區分什麼是程序,什麼是系統調用或庫函數