簡體   English   中英

從jni返回並訪問Java對象/類

[英]Return and access java object/class from jni

我有一個Java方法,該方法返回對象/類'Readcommpacket'的實例。 從NDK / JNI端開始對Java方法的調用(c ++-> java-> return-> java object-> c ++)。 我如何完成此工作,我正努力使用適當的JNI調用/簽名來完成此工作。 任何幫助是極大的贊賞。

Java對象/類用作返回值。

public class ReadCommPacket {

    public byte[] RCPbtyeread;
    public int RCPbytecount;

    public ReadCommPacket(byte[] btyeread, int bytecount){
        this.RCPbtyeread = btyeread;
        this.RCPbytecount = bytecount;
    }
}

JNI調用的Java方法

public ReadCommPacket BTMsgToNDKComm(){
        if(bluetoothConnectedRunnable != null){
            return bluetoothConnectedRunnable.readBT();//returns ReadCommPacket obj
        }
        return new ReadCommPacket(null, -1);
}

JNI / NDK c / c ++代碼

void recvFromBlueTooth(char * recvdByte){

JniMethodInfo methodInfo;
if (! getMethodInfo(&methodInfo, "BTMsgToNDKComm", "V"))//what signature would I use?
{
    LOGD("Cannot find method!");
    return;
}

//retreive btye[] and int from Readcommpacket here. What JNI calls?

}

簽名包含軟件包名稱。

假設包名稱為com.example

那么您的示例中的簽名將是:

()Lcom/example/ReadCommPacket

PS:如果您從C ++調用此方法,請確保Pro Guard不會混淆類名和方法名(如果使用它)


運行命令javap -s classname.class輸出將包含您可以使用的描述符,因為它包括“;”。

例如: javap -s abc.class

嘗試返回abc的實例

Public static com.getInstance();
    descriptor: **()Lcom;**

public int init(java.lang.String, java.lang.String);
    descriptor: **(Ljava/lang/String;Ljava/lang/String;)I**

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM