JNAerator를 사용한 JAVA 및 공유 라이브러리의 결합

6619 단어 JNAeratorJavaJNA

JNAerator를 사용하여 linux 공유 라이브러리와 구조체 데이터를 연결하는 방법의 비망록


리눅스의 공유 라이브러리와 JAVA가 데이터 교환을 할 때 구조체를 사용하는 것이 생각보다 간단하기 때문에 나는 그 방법을 적어 두었다.

JNAerator를 통한 작업


JNASerator 다운로드


다운로드는 여기부터.
https://code.google.com/archive/p/jnaerator/downloads

JNASerator 실행


버전 정보와 날짜 등이 있습니다.
java -jar jnaerator-xxxxxx-SNAPSHORT-xxxxx.jar

화면 시작 후 헤드 파일 붙여넣기


부팅 후 코드를 붙이는 화면이 여기 있습니다.(Raspberry Pi에서 실행)


JNAerate !버튼을 누르다


JNAerate!버튼을 누른 결과는 다음과 같습니다.오른쪽 화면에 JAVA의 코드가 생성되었습니다.

파일에 저장


오른쪽 화면에 표시된 코드를 복사하여 파일에 저장합니다.파일 이름과 클래스가 JNAerator class:에 표시되므로 직접 사용하십시오.단, 이 때 패키지를 사용하고 싶지 않기 때문에 파일 이름은 그 부분을 삭제해야 합니다MAC.자바 주세요.

jar 파일 설치


지금까지의 작업에서 만든 코드를 사용하려면 프로그램 라이브러리를 설치해야 합니다.
프로그램 라이브러리 다운로드 여기 있습니다.
http://www.java2s.com/Code/Jar/j/Downloadjnaeratorruntime011jar.htm
다운로드한 프로그램 라이브러리는 unzip에 의해 자바의 프로그램 라이브러리 폴더에 저장됩니다.
복제 대상 폴더는 환경에 따라 달라집니다.Raspberry Pi3의 경우입니다.
$ unzip jnaerator-runtime-0.11.jar.zip
$ sudo cp jnaerator-runtime-0.11.jar/usr/lib/jvm/jdk-8-oracle-arm32-vfp-hflt/jre/lib/ext/

작성된 라이브러리 수정


제작된'SUBGHZ MAC.java'를 확인합니다.


수정해야 할 코드가 있어서 수정했어요.
+ 파일의 첫 번째 행에 포함된 패키지가 삭제되었습니다.
+ time_t의 위치를 잘 바꾸지 못한 것 같다.linux 시간t는 32비트의 unsigned long형이기 때문에 NativeLong으로 변경되었습니다.

JAVA의 프로듀싱을 수행했습니다.


이런 코드를 만들었어요.

//package com.lapis_semi.lazurite.io;
//import com.ochafik.lang.jnaerator.runtime.Structure;
import java.util.Arrays;
import java.util.List;
import java.util.Date;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.Structure;
import com.sun.jna.NativeLong;

public class LibraryTest {

    interface LazuriteLib extends Library {
        // load library
        LazuriteLib INSTANCE = (LazuriteLib) Native.loadLibrary("lazurite",LazuriteLib.class);

        // functions
        int lazurite_close();
        int lazurite_link(short addr);
        int lazurite_setRxAddr(short tmp_rxaddr);
        int lazurite_setPanid(short tmp_panid);
        int lazurite_setCh(byte ch);
        int lazurite_open();
        int lazurite_write(String payload, short size);
        int lazurite_available();
        int lazurite_read(char[] payload, short[] size);
        int lazurite_readRaw(SUBGHZ_MAC mac);
        int lazurite_getRxTime(Pointer tv_sec,Pointer tv_nsec);
        int lazurite_getRxRssi(Pointer rssi);
        int lazurite_getTxRssi(Pointer rssi);
        int lazurite_test(byte[] payload,short[] size);
    }
    public static void main(String[] args)
    {
        int result;
        LazuriteLib lazurite = LazuriteLib.INSTANCE;

        SUBGHZ_MAC mac = new SUBGHZ_MAC();

        byte ch = 36;
        short panid = (short)0xabcd;
        result = lazurite.lazurite_open();
        result = lazurite.lazurite_setCh(ch);
        result = lazurite.lazurite_setPanid(panid);
        System.out.println("result="+Integer.toString(result));
        do {
            result = lazurite.lazurite_readRaw(mac);
        } while(result <= 0);
        try {
            byte[] raw = mac.raw.getByteArray(0,mac.raw_len);
            String payload = mac.payload.getString(0);
            long t = (mac.tv_sec.longValue() & 0x0ffffffff)*1000 + (mac.tv_nsec.longValue() & 0x0ffffffff)/1000000;
            int rx_addr = mac.rx_addr[1] & 0x00ff;
            rx_addr = (rx_addr << 8) + (mac.rx_addr[0]&0x00ff);
            int tx_addr = mac.tx_addr[1] & 0x00ff;
            tx_addr = (tx_addr << 8) + (mac.tx_addr[0]&0x00ff);
            int rssi = mac.rssi & 0x0000ff;
            //rssi = rssi & 0x000000ff;

            System.out.print(new Date(t) + "\t" +
                    Integer.toHexString(rx_addr) + "\t" + 
                    Integer.toHexString(tx_addr) + "\t" + 
                    Integer.toString(rssi) + "\t" + 
                    payload);
        } catch (Exception e) {}
        result = lazurite.lazurite_close();
    }
}

공유 라이브러리 선언 사용


import을 진행할 프로그램 라이브러리의 성명과 함수의 성명은 이 부분에 있습니다.
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.Structure;
import com.sun.jna.NativeLong;

    interface LazuriteLib extends Library {
        // load library
        LazuriteLib INSTANCE = (LazuriteLib) Native.loadLibrary("lazurite",LazuriteLib.class);

        // functions
        int lazurite_close();
        int lazurite_link(short addr);
        int lazurite_setRxAddr(short tmp_rxaddr);
        int lazurite_setPanid(short tmp_panid);
        int lazurite_setCh(byte ch);
        int lazurite_open();
        int lazurite_write(String payload, short size);
        int lazurite_available();
        int lazurite_read(char[] payload, short[] size);
        int lazurite_readRaw(SUBGHZ_MAC mac);
        int lazurite_getRxTime(Pointer tv_sec,Pointer tv_nsec);
        int lazurite_getRxRssi(Pointer rssi);
        int lazurite_getTxRssi(Pointer rssi);
        int lazurite_test(byte[] payload,short[] size);
    }

구조체 내부의 구성원 변수를 읽는 방법


Pointer


규격은 이쪽https://jna.java.net/javadoc/com/sun/jna/Pointer.html
문자열 가져오기: String payload=mac.payload.getString(0);
0의 섹션은 추출할 데이터의 오프셋입니다.
ByteArry의 취득:byte[]raw=mac.raw.getByteArray(0,mac.raw_len);
Pointer.getByteArray(offset,size);

NativeLong


long t = mac.tv_sec.longValue()

주의 사항


C언사는 여러 차이점이 있기 때문에 공유 라이브러리에서 데이터를 얻은 뒤 JAVA의 데이터형으로 바꾸는 것이 좋다.
+ Java에는 unsigned 유형이 없습니다.
+ 데이터 유형의 비트 길이가 JAVA의 C 언어와 다름

좋은 웹페이지 즐겨찾기