首页  编辑  

安卓Android中JNI调用使用指针和结构数据

Tags: /Android/   Date Created:
安卓中使用JNI调用API,需要使用指针和结构Struct,如何做?
例如在安卓中调用海康SDK中的未公开的一些接口,需要使用JNI实现?
import com.sun.jna.Callback;
import com.sun.jna.Library;
import com.sun.jna.Pointer;
import com.sun.jna.Structure;
import com.sun.jna.Union;
import com.sun.jna.ptr.ByteByReference;
import com.sun.jna.ptr.IntByReference;
public static class NET_DVR_PRESET_NAME2 extends Structure {
    public int dwSize;
    public short wPresetNum;
    public byte[] byRes1 = new byte[2];
    public byte[] byName = new byte[32];
    public short wPanPos;
    public short wTiltPos;
    public short wZoomPos;
    public byte[] byRes = new byte[58];

    @Override
    protected List<String> getFieldOrder() {
        return Arrays.asList("dwSize", "wPresetNum", "byRes1", "byName", "wPanPos", "wTiltPos", "wZoomPos", "byRes");
    }
}
boolean NET_DVR_SetDVRConfig(int lUserID, int dwCommand, int lChannel, Pointer lpInBuffer, int dwInBufferSize);
HCNetSDKByJNA.NET_DVR_PRESET_NAME2 preset_name = new HCNetSDKByJNA.NET_DVR_PRESET_NAME2();
preset_name.dwSize = preset_name.size();
preset_name.byName = name.getBytes("GBK");
preset_name.wPresetNum = (short) presetNo;
preset_name.write();
boolean b = jna.NET_DVR_SetDVRConfig(mLoginId, 3382, 1, preset_name.getPointer(), preset_name.size());
Log.i(Log.TAG, "设置海康预置位名: " + LastError() + " 结果: " + b);
首先要从自己定义个继承自Structure类的Class,凡是Struct中的数据对象,都必须用public关键字修饰。
然后定义的这个Class,必须继承写一个getFieldOrder()方法。
最后new 一个strucure类之后,可以给Structure成员赋值,赋值之后,在调用JNI接口之前,务必调用.write()方法才能写入内存块。调用的时候,用getPointer()方法获取内存指针块就可以了。
同理,如果是返回指针结构数据,需要使用.read()方法读取到内存中才可以。