2016-07-04 19 views
1

我有一個服務它通過JNI調用C函數。然後該函數會生成一個pthread並將其附加到JVM。我從這個pthread調用Java方法,該方法應該發佈Toast通知。不幸的是,一旦Toast通知被調用,我得到一個空指針異常Android - Toast調用的空指針

這是處理我的服務類Toast調用方法:

public void showToast(final String msg) { 
    final Context MyContext = this; 
    Handler h = new Handler(MyContext.getMainLooper()); 
    h.post(new Runnable() { 
     @Override 
     public void run() { 
      Toast myToast = Toast.makeText(MyContext, msg, Toast.LENGTH_SHORT); 
      myToast.show(); 
     } 
    }); 
} 

什麼可能會導致空指針異常,我該如何解決

它試圖從C函數中獲取上下文失敗嗎?

以下是錯誤消息

W/dalvikvm(4010): JNI WARNING: JNI method called with exception pending 
W/dalvikvm(4010):    in Ldalvik/system/NativeStart;.run:()V (CallVoidMethod) 
W/dalvikvm(4010): Pending exception is: 
I/dalvikvm(4010): java.lang.NullPointerException: 
I/dalvikvm(4010): at android.content.ContextWrapper.getMainLooper(ContextWrapper.java:104) 

使用getApplicationContext

I/dalvikvm(6242): java.lang.NullPointerException: 
I/dalvikvm(6242): at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:109) 
+0

您可以發佈確切的錯誤消息調用訪問適當的範圍內? –

+2

您是否嘗試過使用getApplicationContext()而不是'this'? –

+0

是的。你應該使用getApplicationContext()作爲@ρяσѕρєяK提到的。 –

回答

0

問題是,當通過JNI從C線程調用時,我們無法獲取上下文。我們必須從Service線程本身獲取上下文。爲了做到這一點:

public class MyService extends Service{ 
    private static Context MyContext; /* get context to use when displaying toast from JNI*/ 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    public void onDestroy() { 
    } 

    @Override 
    public int onStartCommand(Intent intent,int flags, int startid){ 
     MyContext = getApplicationContext(); 
     // do what you need to 
     return START_STICKY; 
    } 

    public void showToast(final String msg) { 
     Handler h = new Handler(MyContext.getMainLooper()); 
     h.post(new Runnable() { 
      @Override 
      public void run() { 
      Toast myToast = Toast.makeText(MyContext, msg, Toast.LENGTH_SHORT); 
      myToast.show(); 
      } 
     }); 
    } 
} 

這樣一來,我們有一個靜態的參考,我們可以用我們的JNI

0

試試這個:

Toast.makeText(MyContext, msg, Toast.LENGTH_SHORT).show(); 

這是我怎麼總是做它,它只會崩潰,如果msg不爲null。

試試看,如果不起作用,請檢查之前msg爲空。你可以做這樣的事情。

if (msg.equals(null){ 
msg = "Variable was null"; 
} 
Toast.makeText(MyContext, msg, Toast.LENGTH_SHORT).show(); 

順便說一句,我忘了考慮,你可能沒有得到這意味着什麼。

如果您在運行應用程序時收到Toast消息Variable爲null。這意味着無論方法調用來自哪裏,都發送一個空字符串。你需要找到方法調用並找出它傳遞的變量爲什麼爲空。

例如搜索你的項目這個showToast(

搜索這一號召,多次因爲它的製造。如果有一個以上的電話,您可以在每次調用檢查字符串你把它面前,如果它是空的,你可以添加一個字符串,它可以幫助你確定調用來自哪裏,你可以在每次調用之前使用上面提到的代碼,但是檢查發送的變量,然後使其相等「來自xxxxx的調用爲空」 「xxxx是調用的位置,然後你可以找出爲什麼變量發送爲空。

也嘗試我用getApplicationContext()而不是MyContext所說的

+0

它不是空字符串,而是上下文 –