2013-03-05 72 views
6

我面臨一個問題,我的應用程序中,我有以下代碼加載應用程序需要的lib(JNI):JNI加載:警告:不要硬編碼使用Context.getFilesDir()。getPath()代替

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

所以我得到警告:"Do note hardcode use Context.getFilesDir().getPath() instead"這是完全合法的(它不會在每個設備上都可移植)。事情是,因爲我使用靜態我不能呼籲Context.getFilesDir().getPath()

你對我如何繼續做這件事有什麼想法嗎?

+0

你從什麼得到警告? – EJP 2013-03-05 09:18:06

+0

在system.Load中,我得到:不要硬編碼「/ data /」;使用Context.getFilesDir()。getPath()而不是 – Joze 2013-03-05 09:23:36

+0

由於lint警告說在Eclipse中相同,所以到達此處。發現這篇文章,如果正確的話,有點令人擔憂:https://code.google.com/p/android/issues/detail?id=43533 – brandall 2013-03-05 20:32:29

回答

12

你的警告是絕對清楚的,儘量不要使用以下方法:

使下面的類:

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

聲明上面的類在你的Android清單:

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

然後

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沒有測試

+0

感謝您的回答,但我得到:無法對非靜態方法進行靜態引用getFilesDir()從類型上下文 – Joze 2013-03-05 09:21:51

+0

@Joze檢查我的編輯。 – NullPointer 2013-03-05 09:44:44

+0

剛剛嘗試過,但我得到:/data/data/com.mypackage.appname/files而不是我需要的:/data/data/com.mypackage.appname/(沒有文件)。 任何猜測? – Joze 2013-03-05 09:56:16

1

你可以從應用程序派生類語境。 看看example所以你可以在任何地方使用你的應用程序上下文:)

+0

我現在要試一試。謝謝。我會讓你更新。 – Joze 2013-03-05 09:24:39