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

时间:2015-05-14 04:03:47

标签: java android c++ android-ndk java-native-interface

我有一个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?

}

2 个答案:

答案 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**