2013-03-05 120 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