1. 程式人生 > >java 專案打包

java 專案打包

java連線c++動態庫並生成jar包提供給別人呼叫

1、需要將java通過jni生成標頭檔案,並匯入到c++專案並對c++進行jni方法繼承

  

javac -encoding utf8 D:\project\DeviceDemo\src\com\javaCallDll\DemoController.java

javah -jni  com.javaCallDemo.DemoController

2、c++是多執行緒回撥,需要將當前執行緒註冊到虛擬機器中用到AttachCurrentThread

 
 
 
void TabletRemoteContollerRbtAdapter::onDeviceMac(rbt_win_context* context, const char* pMac) {
	JNIEnv* pEnv;
	gs_jvm->AttachCurrentThread((void **)&pEnv, NULL);
	if (!pEnv) {
		std::cout << "pEnv == null" << std::endl;
		return;
	}

	jclass jClassTmp = pEnv->GetObjectClass(_correspondJavaClassInstance);
	_onDeviceMacMethodID = pEnv->GetMethodID(jClassTmp, "onDeviceMac", "(Ljava/lang/String;)V");
	if (!_onDeviceMacMethodID) {
		std::cout << "_onDeviceMacMethodID is nullptr" << std::endl;
		return;
	}

	jstring jMac = CStrToJStr(pEnv, pMac);
	pEnv->CallVoidMethod(_correspondJavaClassInstance, _onDeviceMacMethodID, jMac);
}

  

3、在java 寫主調函式和回撥函式在主調初始化的時候將回調類做為引數傳進去

    public static final TabletRemoteController tabletRemoteController = new TabletRemoteController();

    /**
     * 初始化介面
     * @param rbtDataCallBack
     * @return
     */
    public int init(RbtDataCallBack rbtDataCallBack) {
        tabletRemoteController.setRbtDataCallBack(rbtDataCallBack);
        int res= tabletRemoteController.init();
        return res;
    }

  

  public class TabletRemoteController {

    static {
        System.loadLibrary("device");
        System.loadLibrary("ControllerAdapter");
    }

    private RbtDataCallBack rbtDataCallBack;

  public void setRbtDataCallBack(RbtDataCallBack rbtDataCallBack) {
        this.rbtDataCallBack = rbtDataCallBack;
    }

    public void onOriginData(String mac, int s, int x, int y, int p, byte[] buffer, int len) {
        rbtDataCallBack.onOriginData(mac, s, x, y, p, buffer, len);

    }

  

4、將c++動態庫回撥資料進行處理的可以繼承回撥類介面

public interface RbtDataCallBack {
    void onOriginData(String mac, int s, int x, int y, int p, byte[] buffer, int len);
    void onDeviceMac(String mac);
}

  

public class SampleCode {

    public static void main(String[] args) {
        RbtDeviceWifi rbtDeviceWifi = new RbtDeviceWifi();
        rbtDeviceWifi.init(new RbtDataCallBack() {
            @Override
            public void onOriginData(String mac, int s, int x, int y, int p, byte[] buffer, int len) {
                System.out.println("mac=" + mac + " s=" + s + " x=" + x + " y=" + y + " p=" + p + " byte=" + buffer + " len=" + len);
            }

  

5、將專案進行打包並提供動態庫給客戶

  開啟project Structure 選擇+號 進行