2016-07-04 3 views
1

나는 JNI를 통해 C 함수를 호출합니다. 이 함수는 pthread을 생성하고이를 JVM에 연결합니다. 이 pthread에서 Java 메소드를 호출하여 Toast 알림을 게시해야합니다. 불행히도 Toast 알림이 호출되자 마자 null 포인터 예외이 발생합니다.Android - 토스트 호출의 Null 포인터

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(); 
     } 
    }); 
} 

는 널 포인터 예외의 원인이 무엇을 할 수 있고, 는 어떻게 그것을를 해결할 수 있습니다 : 여기

내 서비스 클래스에 Toast 전화를 처리하는 방법?

C 함수에서 컨텍스트를 가져 오는 데 실패합니까? 여기

getApplicationContext를 사용하여 오류 메시지

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) 

입니다 :

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

당신이 정확한 오류 메시지를 게시 할 수에 액세스 할 수있는 적절한 컨텍스트에 정적 참조가? –

+2

'this' 대신 getApplicationContext()를 사용해 보셨습니까? –

+0

예[email protected] ρяσѕρєяK 언급 된대로 getApplicationContext() 사용해야합니다. –

답변

0

문제는 C 스레드에서 JNI를 통해 호출 될 때 컨텍스트를 가져올 수 없다는 것입니다. 서비스 스레드 자체에서 컨텍스트를 가져와야합니다. 이를 위해 :

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가 null인지 확인하십시오. 이런 식으로 할 수 있습니다.

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

그렇다면이 의미가 무엇인지 알지 못할 수도 있다는 점을 잊어 버렸습니다.

토스트 메시지를받는 경우 앱을 실행할 때 변수가 null입니다. 메서드 호출이 어디서 왔는지는 null 문자열을 보내는 것입니다. 메소드 호출을 찾고 전달하는 변수가 null 인 이유를 찾아야합니다.

예를 들어이 만들어졌다으로 하나 이상의 전화가있는 경우 당신이 그것을하기 전에 당신이 각 통화에서 문자열을 확인할 수 있습니다. 여러 번,이 showToast (즉, 호출

검색을위한 프로젝트를 검색하고, null 인 경우 호출의 출처를 식별하는 데 도움이되는 문자열을 추가 할 수 있습니다. 각 호출 전에 위에 쓴 코드를 사용할 수 있지만 대신 변수를 확인한 다음 "xxxxx에서 호출이 null입니다" " "xxxx는 호출이 만들어진 위치입니다. 그러면 전송 된 변수가 null 인 이유를 알 수 있습니다.

MyContext 대신 getApplicationContext()를 사용하여 시도해보십시오.

+0

그것은 null이 아닌 문자열이지만 컨텍스트 –