2017-02-28 4 views
1

Je travaille sur une application propriétaire pour les boîtes Android qui lit l'entrée HDMI et l'affiche dans une partie de l'écran. Pour cela, nous utilisons R9 Mini Android TV box (link). Le fournisseur fourni avec le code source d'un exemple d'application pour lire l'entrée HDMI, mais l'application ne parvient pas à lancer l'erreur de lancement pop-up (Malheureusement, SourceIn a arrêté).Android: Impossible de charger une bibliothèque système

Ce qui suit est la trace de pile d'exception:

02-28 15:38:36.988 3232-3232/rtk.com.RealtekSourceIn W/art: Method processed more than once: void android.app.Instrumentation.callActivityOnResume(android.app.Activity) 
02-28 15:38:37.090 3232-3232/rtk.com.RealtekSourceIn A/art: art/runtime/barrier.cc:90] Check failed: count_ == 0 (count_=-1, 0=0) Attempted to destroy barrier with non zero count 
02-28 15:38:37.090 3232-3232/rtk.com.RealtekSourceIn A/art: art/runtime/runtime.cc:366] Runtime aborting --- recursively, so no thread-specific detail! 
02-28 15:38:37.090 3232-3232/rtk.com.RealtekSourceIn A/art: art/runtime/runtime.cc:366] 
02-28 15:38:37.090 3232-3232/rtk.com.RealtekSourceIn A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 3232 (RealtekSourceIn) 

L'accident est déclenchée à partir du code à l'intérieur d'une dépendance de la bibliothèque. Lors du débogage du fichier .class décompilé. Voici le code où l'erreur ci-dessus est jeté:

static { 
    System.loadLibrary("realtek_runtime"); 
} 

J'ai vu les fichiers .so dans/system/lib/dossier et trouvé librealtek_runtime.so être présent, donc je suis incapable de comprendre pourquoi loadLibrary échoue.

Voici le code correspondant:

RTKSourceInActivity:

public class RTKSourceInActivity extends Activity { 

    private String TAG="HDMIRxActivity"; 
    private ViewGroup m_Root; 
    private HDMIRxPlayer m_HDMIRxPlayer = null; 
    private final Handler mHandler = new Handler(); 
    private byte[] mCapture; 
    private static final long SCREENSHOT_SLOT = 200; 
    private boolean mIsFullScreen = true; 

    private File mRecordFile; 
    private boolean mRecordOn = false; 

    @Override 
    public void onResume() { 
     Log.d(TAG,"onResume"); 
     super.onResume(); 
     if(hasRtkMusicPlaybackService()) { 
      Intent i = new Intent("com.android.music.musicservicecommand"); 
      i.putExtra("command", "stop"); 
      sendBroadcast(i); 
     } 
     m_Root = (ViewGroup) findViewById(R.id.root); 
     m_HDMIRxPlayer = new HDMIRxPlayer(this, m_Root, 1920, 1080); 
    } 

... 
} 

HDMIRxPlayer:

public HDMIRxPlayer(Context context, ViewGroup parent, int width, int height) 
{ 
    mContext = context; 
    mSurfaceView = new SurfaceView(context); 
    mSurfaceHolder = mSurfaceView.getHolder(); 
    mSurfaceHolder.addCallback(HDMIRXCallback); 
    mSurfaceHolder.setFixedSize(width, height); 
    parent.addView(mSurfaceView); 

    mHDMIRX = new RtkHDMIRxManager(); // Exception here 

    IntentFilter hdmiRxFilter = new IntentFilter(HDMIRxStatus.ACTION_HDMIRX_PLUGGED); 
    mContext.registerReceiver(hdmiRxHotPlugReceiver, hdmiRxFilter); 
} 

RtkHDMIRxManager est un .class dans le pot de dépendance (realtek classes) donnée par le vendeur .

Quand je l'ai placé des points de mise au point dans les décompilé de la version RtkHDMIRxManager, je trouve l'exception à:

static { 
    System.loadLibrary("realtek_runtime"); 
} 

Toute direction pointant vers la solution serait d'une grande aide.

Répondre

0

2 façons de résoudre:

  1. je devais utiliser android:sharedUserId="android.uid.system" et signer avec l'application correspondante pem et pk8 fichiers.

  2. Installez l'application, utilisez les commandes adb pour déplacer l'application dans le répertoire/system /. Ce n'est pas une application système. Vous pouvez partager toutes les ressources système maintenant.