亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

帶有附加參數的 JNA 回調函數

帶有附加參數的 JNA 回調函數

精慕HU 2021-09-03 17:10:38
我在讓 JNA 全部解決時遇到問題。我正在嘗試調用一個函數,該函數將函數和const char*. 我的 C 代碼如下所示:typedef void (*example_ptr)(const char*);void exampleMethod(const char* value){    printf("This is the string: %s\n", value);}void example_triggerCallback(const example_ptr func, const char* str) {    printf("provided str: %s", str);    func(str);}為了實現這一點,我用 Java 編寫了這樣的 JNA 包裝器public class Main {    public interface TestLibrary extends Library {        TestLibrary INSTANCE = (TestLibrary)                Native.loadLibrary("libtest",                        TestLibrary.class);        interface ExampleCallback extends Callback {            void invoke(String str);        }        class ExampleCallbackImpl implements ExampleCallback {            public void invoke(String str) {                System.out.println("example: " + str);            }        }        void example_triggerCallback(ExampleCallback callback, String str);    }    public static void main(String[] args) {        TestLibrary testLibrary = TestLibrary.INSTANCE;        final TestLibrary.ExampleCallbackImpl callback = new TestLibrary.ExampleCallbackImpl();        testLibrary.example_triggerCallback(callback, "testiddy test test");    }}我現在面臨的問題是,printf在example_triggerCallbackC代碼其實是在正打來電話,我得到的輸出Java控制臺上,但什么我真的想在這里實現的是,我想從Java傳遞側指針為exampleMethod從C 所以它會打印通過的String. 現在func(str)好像被忽略了。我在這里缺少什么?
查看完整描述

1 回答

?
喵喔喔

TA貢獻1735條經驗 獲得超5個贊

基于JNA 文檔中的內容:


typedef void (*ExampleCallback)(const char*);


void exampleMethod(const char* value)

{

    printf("This is the string: %s\n", value);

}


void example_triggerCallback(const example_ptr func, const char* str) {

    printf("provided str: %s", str);

    func(str);

}

public interface CLibrary extends Library {

    // define an interface that wraps the callback code

    public interface ExampleCallbackInterface extends Callback {

        void invoke(String val);

    }


        // functions available in library (name must match)

    public void exampleMethod(String  value);

    public void example_triggerCallback(ExampleCallbackInterface callback);

}


// define an implementation of the callback interface

public static class CallbackExample implements Example22CallbackInterface {

    private CLibrary lib;


    public CallbackExample(CLibrary useLib) {

        lib = useLib;

    }


    @Override

    public void invoke(String val) {

        lib.exampleMethod(val);

    }

}


...

final CLibrary clib = (CLibrary)Native.loadLibrary("testlib", CLibrary.class);

...

// instantiate a callback wrapper instance

final CallbackExample callback = new CallbackExample(clib);


// pass the callback wrapper to the C library

clib.example_triggerCallback(callback);

由于我在其他互聯網位置回答了這個問題,因此我知道它適用于提問者。


查看完整回答
反對 回復 2021-09-03
  • 1 回答
  • 0 關注
  • 322 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號