有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

安卓从jni返回并访问java对象/类

我有一个Java方法,它返回对象/类“Readcommpacket”的实例。对Java方法的调用是从NDK/JNI端(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/NDKC/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?

}

共 (2) 个答案

  1. # 1 楼答案

    签名包含包名

    假设包名为com。范例

    那么您的示例中的签名将是:

    ()Lcom/example/ReadCommPacket
    

    P.S.如果从C++调用此方法,请确保类名称和;pro guard不会混淆方法名称(如果使用)


  2. # 2 楼答案

    运行命令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**