跳到正文

Java调用示例

加载SDK

在程序包名下方引入动态库

LibSdk INSTANCE = Native.loadLibrary(\"libsdk.so\", LibSdk.class);//路径可以修改。示例中的libsdk.so该程序在同一路径下。可根据情况自行指定。

调用示例

Test.java
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
 
public interface LibSdk extends Library {
    LibSdk INSTANCE = Native.loadLibrary("/opt/tip/bin/sdk/so_path/libsdk.so", LibSdk.class);
 
    Pointer GetDeviceId(GoString.ByValue sn);
    Pointer OnLineUpgrade(GoString.ByValue lid, GoString.ByValue sn, GoString.ByValue key, GoString.ByValue salt, int pkgSize);
    Pointer OffLineUpgrade(GoString.ByValue dataPath, GoString.ByValue lid, GoString.ByValue sn, GoString.ByValue salt,
        int pkgSize);
    Pointer QueryIOC(GoString.ByValue query);
    Pointer QueryIP(GoString.ByValue query);
    void FreeMemory(Pointer str);
}
public static void main(String args[]) {
    LibSdk.INSTANCE.OnLineUpgrade("lid", "sn", "key", "salt", 0);
    GoString.ByValue query_ip_lst = new GoString.ByValue(
        "192.241.211.252,180.182.234.19,185.220.102.250,117.34.72.226");
    Pointer ipRes = LibSdk.INSTANCE.QueryIP(query_ip_lst);
    String ipAns = ipRes.getString(0);
    LibSdk.INSTANCE.FreeMemory(ipRes); //调用内存释放函数。否则在一个不间断的服务中调用动态库会内存泄漏
}
Gostring.java
import com.sun.jna.Structure;
import java.util.ArrayList;
import java.util.List;
 
public class GoString extends Structure {
    public String p;
    public long n;
 
 
    public GoString(String str) {
        this.p = str;
        this.n = str.getBytes(StandardCharsets.UTF_8).length;
    }
 
    @Override
    protected List < String > getFieldOrder() {
        List < String > fields = new ArrayList < > ();
        fields.add("p");
        fields.add("n");
        return fields;
    }
 
 
    public static class ByValue extends GoString implements Structure.ByValue {
        public ByValue(String str) {
            super(str);
        }
    }
}