2013-03-05 8 views
6

Sono di fronte a un problema in una delle mie app, ho il seguente codice per caricare una lib (JNI) necessaria per l'app:Caricamento JNI: Avviso: non utilizzare hardcode Context.getFilesDir(). GetPath() invece

static { 
    // load the JNI library 
    Log.i("JNI", "loading JNI library..."); 
    System.load("/data/data/com.mypackage.appname/lib/libxxxxxx.so"); 
    Log.i("JNI", "JNI library loaded!"); 
} 

Quindi ricevo l'avviso: "Do note hardcode use Context.getFilesDir().getPath() instead" che è totalmente legittimo (non sarà portatile su tutti i dispositivi). Il fatto è che, poiché sto usando statico, non posso chiamare Context.getFilesDir().getPath().

Avete qualche idea su come posso procedere?

+0

Hai ricevuto l'avviso da cosa? – EJP

+0

In system.Load I get: Do hardcode "/ data /"; utilizzare Context.getFilesDir(). getPath() invece – Joze

+0

Arrivato qui a causa dell'avvertenza del lint che dice lo stesso in Eclipse. Ho notato questo post, che, se corretto, è un po 'preoccupante: https://code.google.com/p/android/issues/detail?id=43533 – brandall

risposta

12

tuo avviso è assolutamente chiaro, provare la seguente modo:

fare la seguente classe:

public class MyApplication extends Application { 
    private static Context c; 

    @Override 
    public void onCreate(){ 
     super.onCreate(); 

     this.c = getApplicationContext(); 
    } 

    public static Context getAppContext() { 
     return this.c; 
    } 
} 

dichiarare la classe di cui sopra nel vostro manifest Android:

<application android:name="com.xyz.MyApplication"></application> 

E poi

static { 
    // load the JNI library 
    Log.i("JNI", "loading JNI library..."); 

    System.load(MyApplication.getAppContext().getFilesDir().getParentFile().getPath() + "/lib/libxxxxxx.so"); 

    Log.i("JNI", "JNI library loaded!"); 
} 

P.S non testato

+0

Grazie per la risposta, ma ottengo: Impossibile creare un riferimento statico al metodo non statico getFilesDir() dal tipo Context – Joze

+0

@Joze Controlla la mia modifica. – NullPointer

+0

Ho appena provato, ma ottengo: /data/data/com.mypackage.appname/files invece di quello che mi serve: /data/data/com.mypackage.appname/ (nessun file). Qualche ipotesi? – Joze

1

È possibile ottenere Context dalla classe derivata da Application. dare un'occhiata a example Quindi è possibile utilizzare il contesto dell'applicazione ovunque :)

+0

Lo proverò adesso. Grazie. Ti terrò aggiornato. – Joze