2015-05-11 31 views
0

我試圖內的Android NDK從發送短信。當我嘗試調用SmsManager中的sendTextMessage方法時,我的應用程序崩潰,錯誤代碼爲6(中止)。此外,我收到一條errormessage,內容爲「decodeIndirectRef中的無效間接引用0xe7f03658」。我認爲這與我的對象引用有關,但我所看到的對象並沒有被我使用的對象使用。JNI CallVoidMethod導致致命的信號6和無效的間接引用

應用崩潰時執行的最後一行。我檢查了一切例外情況,但沒有一個正在上升。

#ifndef NULL 
#define NULL ((void *) 0) 
#endif 

#include <string.h> 
#include <jni.h> 
#include <android/log.h> 

JNIEXPORT void JNICALL Java_tss_challenges_hybrid_App_sendSMS(JNIEnv* env, 
     jobject thiz) { 
    jclass smsManagerClz = (*env)->FindClass(env, 
      "android/telephony/SmsManager"); 
    jmethodID getDefaultMethodID = (*env)->GetStaticMethodID(env, smsManagerClz, 
      "getDefault", "()Landroid/telephony/SmsManager;"); 
    jobject smsManagerObj = (*env)->CallStaticObjectMethod(env, smsManagerClz, 
      getDefaultMethodID); 
    jmethodID sendSMSMethodID = (*env)->GetMethodID(env, smsManagerClz, 
      "sendTextMessage", 
      "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;" 
        "Landroid/app/PendingIntent;Landroid/app/PendingIntent;)V"); 

    jstring number = (*env)->NewStringUTF(env, "1234"); 
    jstring text = (*env)->NewStringUTF(env, "sms content"); 
    jstring nullString = (*env)->NewStringUTF(env, NULL); 

    __android_log_print(ANDROID_LOG_VERBOSE, "MyApp", "%x,%x,%x,%x,%x,%x,%x,%x", number, text, nullString,smsManagerObj,sendSMSMethodID,env,smsManagerClz,getDefaultMethodID); 
    (*env)->CallVoidMethod(env, smsManagerObj, sendSMSMethodID, number, nullString, text, NULL, NULL); 
} 

日誌:

05-11 14:17:00.718: D/dalvikvm(2376): Trying to load lib /data/app-lib/tss.chalenges.hybrid-1/libnativeSMSManager.so 0xb2d5b2d0 
05-11 14:17:00.718: D/dalvikvm(2376): Added shared lib /data/app-lib/tss.chalenges.hybrid-1/libnativeSMSManager.so 0xb2d5b2d0 
05-11 14:17:00.718: D/dalvikvm(2376): No JNI_OnLoad found in /data/app-lib/tss.chalenges.hybrid-1/libnativeSMSManager.so 0xb2d5b2d0, skipping init 
05-11 14:17:00.848: V/MyApp(2376): c2900025,a0f00029,0,ba100021,b0be31c0,b82cff30,b680001d,b0be2f18 
05-11 14:17:00.948: W/dalvikvm(2376): Invalid indirect reference 0xe7f03658 in decodeIndirectRef 
05-11 14:17:00.948: I/dalvikvm(2376): "main" prio=5 tid=1 RUNNABLE 
05-11 14:17:00.948: I/dalvikvm(2376): | group="main" sCount=0 dsCount=0 obj=0xb2a94ca8 self=0xb82d3398 
05-11 14:17:00.958: I/dalvikvm(2376): | sysTid=2376 nice=0 sched=0/0 cgrp=apps handle=-1225264812 
05-11 14:17:00.958: I/dalvikvm(2376): | state=R schedstat=(100000000 380000000 94) utm=6 stm=4 core=0 
05-11 14:17:00.958: I/dalvikvm(2376): at tss.challenges.hybrid.App.sendSMS(Native Method) 
05-11 14:17:00.958: I/dalvikvm(2376): at tss.challenges.hybrid.App.onCreate(App.java:36) 
05-11 14:17:00.958: I/dalvikvm(2376): at android.app.Activity.performCreate(Activity.java:5231) 
05-11 14:17:00.958: I/dalvikvm(2376): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
05-11 14:17:00.958: I/dalvikvm(2376): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159) 
05-11 14:17:00.958: I/dalvikvm(2376): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) 
05-11 14:17:00.958: I/dalvikvm(2376): at android.app.ActivityThread.access$800(ActivityThread.java:135) 
05-11 14:17:00.958: I/dalvikvm(2376): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
05-11 14:17:00.958: I/dalvikvm(2376): at android.os.Handler.dispatchMessage(Handler.java:102) 
05-11 14:17:00.958: I/dalvikvm(2376): at android.os.Looper.loop(Looper.java:136) 
05-11 14:17:00.958: I/dalvikvm(2376): at android.app.ActivityThread.main(ActivityThread.java:5017) 
05-11 14:17:00.958: I/dalvikvm(2376): at java.lang.reflect.Method.invokeNative(Native Method) 
05-11 14:17:00.958: I/dalvikvm(2376): at java.lang.reflect.Method.invoke(Method.java:515) 
05-11 14:17:00.958: I/dalvikvm(2376): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
05-11 14:17:00.958: I/dalvikvm(2376): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
05-11 14:17:00.958: I/dalvikvm(2376): at dalvik.system.NativeStart.main(Native Method) 
05-11 14:17:00.998: E/dalvikvm(2376): VM aborting 
05-11 14:17:01.018: A/libc(2376): Fatal signal 6 (SIGABRT) at 0x00000948 (code=-6), thread 2376 (halenges.hybrid) 
+0

至於這篇文章的標籤,這是被編譯成C或C++代碼?看到我看不到你的函數被聲明爲'extern「C」',並且'JNIEnv'是根據是否定義了__cplusplus來區別鍵入的(參見'jni.h'),我不確定你當前的'env - > ...'調用將在C++中表現。 – zenzelezz

+0

我將標記更改爲C.我確定它被編譯爲純C代碼。包含代碼的文件是一個「.c」文件。有另一個地方可以從中獲取這些信息嗎? – Manuel

+0

你能顯示本機堆棧崩潰跟蹤嗎?應該遵循「致命信號6」。如果你打開CheckJNI(http://developer.android.com/training/articles/perf-jni.html#extended_checking),你應該得到更詳細的信息。 – fadden

回答

0

您無需通過空字符串,你可以直接在那個地方的說法傳NULL

避免這種

jstring nullString = (*env)->NewStringUTF(env, NULL); 

嘗試使用NULL

jstring nullString = (*env)->NewStringUTF(env, ""); 
+0

我曾經只提供NULL。但後來我發現這個:http://stackoverflow.com/questions/11055609/invalid-indirect-reference-on-newobject-call並按照改變我的代碼。這兩個版本都會導致上述問題。我絕對想要將NULL傳遞給函數。 jstring nullString =(* env) - > NewStringUTF(env,「」);是空串,不是嗎? – Manuel

相關問題