我有一个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 / 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?
}
答案 0 :(得分:0)
签名包含包名。
我们假设包名是com.example
然后你的例子中的签名将是:
()Lcom/example/ReadCommPacket
P.S。如果你从c ++调用这个方法,请确保类名和&方法名称不会被专业保护人员混淆(如果你使用它)
答案 1 :(得分:0)
运行命令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**