2013-03-05 8 views
6

Mam do czynienia z problemem w jednej z moich aplikacji, mam następujący kod, aby załadować lib (JNI) potrzeby aplikacji:Ładowanie JNI: Ostrzeżenie: Nie używaj hardcode Context.getFilesDir(). GetPath() zamiast

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!"); 
} 

Otrzymuję ostrzeżenie: "Do note hardcode use Context.getFilesDir().getPath() instead", które jest całkowicie zgodne z prawem (nie będzie przenośne na każdym urządzeniu). Chodzi o to, ponieważ używam statycznego nie mogę zadzwonić na Context.getFilesDir().getPath().

Czy masz jakieś pomysły na to, jak mogę to zrobić?

+0

Otrzymujesz ostrzeżenie od czego? – EJP

+0

W system.Load otrzymuję: Nie koduj "/ data /"; użyj Context.getFilesDir(). getPath() zamiast tego – Joze

+0

Przyjechałem tutaj z powodu ostrzeżenia o lintach, mówiącego to samo w Eclipse. Zauważyłem ten post, który, jeśli jest poprawny, jest trochę niepokojący: https://code.google.com/p/android/issues/detail?id=43533 – brandall

Odpowiedz

12

Twój ostrzeżenie jest absolutnie jasne, spróbuj w następujący sposób Zamiast:

wprowadzić następujące klasy:

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

zadeklarować powyższą klasę w android manifeście:

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

a następnie

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 nie testowano

+0

Dziękuję za odpowiedź, ale otrzymuję: Nie można utworzyć statycznego odwołania do metody niestatycznej getFilesDir() z typu Kontekst – Joze

+0

@Joze Sprawdź moją edycję. – NullPointer

+0

Po prostu wypróbowałem, ale otrzymałem: /data/data/com.mypackage.appname/files zamiast tego, czego potrzebuję: /data/data/com.mypackage.appname/ (bez plików). Jakieś domysły? – Joze

1

można uzyskać kontekst ze swojej klasy pochodnej z Aplikacji. spójrz na example. Możesz korzystać ze swojego kontekstu aplikacji wszędzie :)

+0

Spróbuję teraz. Dzięki. Będę Cię aktualizował. – Joze