Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android NDK将字节数组传递给java,获取[B@...而不是内容_Android_Reflection_Java Native Interface_Sms_Private Members - Fatal编程技术网

Android NDK将字节数组传递给java,获取[B@...而不是内容

Android NDK将字节数组传递给java,获取[B@...而不是内容,android,reflection,java-native-interface,sms,private-members,Android,Reflection,Java Native Interface,Sms,Private Members,我试图从Android SmsTracker中提取字节数组的内容,并将其转换为txt正文,但当我打印内容时,我得到了[B@ADDRESS相反,这是我的代码 static void my_gsmsendsms(JNIEnv *env, jobject this, jobject tracker) { char bodychars[25] = "unable to pass body "; jstring smsBody = (*env) ->NewStringUTF(env,

我试图从Android SmsTracker中提取字节数组的内容,并将其转换为txt正文,但当我打印内容时,我得到了[B@ADDRESS相反,这是我的代码

static void my_gsmsendsms(JNIEnv *env, jobject this, jobject tracker)
{
    char bodychars[25] = "unable to pass body ";
    jstring smsBody = (*env) ->NewStringUTF(env,bodychars);
    jclass trackercls = (*env)->GetObjectClass(env,tracker);
    jfieldID mDfieldId = (*env)->GetFieldID(env, trackercls, "mData", "Ljava/util/HashMap;");
    jobject mData = (*env)->GetObjectField(env,tracker,mDfieldId);
    jclass bodunpack = (*env)->FindClass(env, "net/example/smsDispatcher/BodyUnpacker");
    jmethodID unpackbod = (*env)->GetStaticMethodID(env, bodunpack, "UnpackBody", "(Ljava/util/HashMap;)Ljava/lang/String;");
    if (unpackbod) {
        jstring body = (*env)->CallStaticObjectMethod(env, bodunpack, unpackbod, mData);
        const char *natBody = (*env)->GetStringUTFChars(env, body, 0);
        __android_log_print(ANDROID_LOG_DEBUG, "ApOw", "body is defined %s",natBody);
        smsBody =body;
    }

    jclass cls = (*env)->GetObjectClass(env,tracker);
    jfieldID fieldId = (*env)->GetFieldID(env, cls, "mDestAddress", "Ljava/lang/String;");
    jstring destAddress = (*env)->GetObjectField(env,tracker,fieldId);
    const char *natBodyString = (*env)->GetStringUTFChars(env, smsBody, 0);
    char msgbody[140] = " smsbody: ";
    strcat(msgbody, natBodyString);
    const char *natDstString = (*env)->GetStringUTFChars(env, destAddress, 0);
    char msg[30] = "smstarget: ";
    strcat(msg, natDstString);
    char charres[170];
    strcpy(charres, msg);
    strcat(charres, msgbody);
    (*env)->ReleaseStringUTFChars(env, destAddress, natDstString);
    (*env)->ReleaseStringUTFChars(env, smsBody, natBodyString);
    log("%s ",charres)
}
我得到的输出是:
smstarget:0123456789 smsbody:[B@b23f41d8

我有一个Java类,它从HashMap中取出字节数组,并使用SMSDispatcher中的正确类将其转换为字符串

public class BodyUnpacker 
{   
    public static String UnpackBody(HashMap<String, Object> mData)
    {
        System.out.println("net.example.smsDispatcher.BodyUnpacker");
        byte[] pdu = (byte []) mData.get("pdu");

        SmsMessage s1 = SmsMessage.createFromPdu(pdu);
        String rs = "cannot read body";
        if (s1 != null) {
            System.out.println("BodyUnpacker: outgoing SMS");
            try {
                if (s1.getDisplayMessageBody() != null) {
                    System.out.println("BodyUnpacker: " + s1.getDisplayMessageBody());
                    rs = s1.getDisplayMessageBody();
                }
                else if (pdu != null) rs = String.valueOf(pdu);
                else rs="message body unavailable";
            } catch (NullPointerException e) {
                rs="message body unavailable";
            }
        }
        return rs;
    }
公共类BodyUnpacker
{   
公共静态字符串正文(HashMap mData)
{
System.out.println(“net.example.smsDispatcher.BodyUnpacker”);
字节[]pdu=(字节[])mData.get(“pdu”);
SmsMessage s1=SmsMessage.createFromPdu(pdu);
字符串rs=“无法读取正文”;
如果(s1!=null){
System.out.println(“BodyUnpacker:outgoing SMS”);
试一试{
如果(s1.getDisplayMessageBody()!=null){
System.out.println(“BodyUnpacker:+s1.getDisplayMessageBody());
rs=s1.getDisplayMessageBody();
}
如果(pdu!=null)rs=String.valueOf(pdu),则为else;
else rs=“消息正文不可用”;
}捕获(NullPointerException e){
rs=“消息正文不可用”;
}
}
返回rs;
}
那么,我是否遗漏了一些明显的东西,或者为什么我的返回字符串实际上是我想要返回的数组的地址? 我曾试图从SmsManager中找到此消息,但它通过Isms.aidl进行跟踪,我丢失了消息的来源。不过,GsmSMSDispatcher会处理此呼叫:

    protected void sendSms(SmsTracker tracker) {
            HashMap<String, Object> map = tracker.mData;

            byte smsc[] = (byte[]) map.get("smsc");
            byte pdu[] = (byte[]) map.get("pdu");
受保护的无效发送SMS(SmsTracker跟踪器){
HashMap map=tracker.mData;
字节smsc[]=(字节[])映射.get(“smsc”);
字节pdu[]=(字节[])映射。获取(“pdu”);
这基本上就是我要做的,但是我不得不使用Native,因为SmsTracker是一个受保护的内部类。 我将非常感谢任何人,他们能够通过我指向hashmap的指针解释本机端正在做什么,这导致演员阵容变得不稳定。
事实上,我的代码触发了gsm版本的SendSms,因此我对这里的类非常确定。

不使用JNI,您可以使用反射。它是纯Java,而且功能强大。不清楚在哪里打印
[B@ADDRESS
,请在代码中标记位置。它位于标记为Do stuff with string的部分,我会编辑。
\u android\u log\u打印(android\u log\u DEBUG,“ApOw”,“body已定义%s”,natBody)
打印正确的字符串?当我通过SmsManager.sendtext调用I get发送消息时,我有两种发送方式[B@b248d120“如果我用Android messanger应用程序发送,我会在日志中看到”body is defined message body unavailable“。这意味着我收到的是空指针异常,不能是文本或电子邮件。