Java Android应用程序上下文参数

Java Android应用程序上下文参数,java,android,this,android-context,Java,Android,This,Android Context,我有一个打包的library.jar,我想从中访问一个类。 但在param中,这需要上下文,我是android开发的新手)。试图在MainActivity上传递(this),但结果是null。你能解释一下为什么会发生这种情况以及如何解决吗 以下是示例代码: Context paramContext = this; ApiHttpClient localApiHttpClient = (ApiHttpClient)paramContext.getSystemService("com.vin

我有一个打包的library.jar,我想从中访问一个类。
但在param中,这需要
上下文
,我是android开发的新手)。试图在
MainActivity
上传递(
this
),但结果是
null
。你能解释一下为什么会发生这种情况以及如何解决吗

以下是示例代码:

Context paramContext = this;
    ApiHttpClient localApiHttpClient = (ApiHttpClient)paramContext.getSystemService("com.vine.api.ApiHttpClient");
    if (localApiHttpClient == null)
      localApiHttpClient = (ApiHttpClient)paramContext.getApplicationContext().getSystemService("com.vine.api.ApiHttpClient");
    if (localApiHttpClient == null)
        Log.d("loadState", "Result is null");
日志:

06-04 10:57:44.502:E/AndroidRuntime(6610):致命异常:主 06-04 10:57:44.502:E/AndroidRuntime(6610):java.lang.ExceptionInInitializeError 06-04 10:57:44.502:E/AndroidRuntime(6610):位于java.lang.Class.classForName(本机方法) 06-04 10:57:44.502:E/AndroidRuntime(6610):在java.lang.Class.forName(Class.java:217)中 06-04 10:57:44.502:E/AndroidRuntime(6610):在java.lang.Class.forName(Class.java:172)中 06-04 10:57:44.502:E/AndroidRuntime(6610):在com.example.dfgdf.MainActivity.onCreate(MainActivity.java:59)上 06-04 10:57:44.502:E/AndroidRuntime(6610):在android.app.Activity.performCreate(Activity.java:5008)上 06-04 10:57:44.502:E/AndroidRuntime(6610):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)上 06-04 10:57:44.502:E/AndroidRuntime(6610):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2140) 06-04 10:57:44.502:E/AndroidRuntime(6610):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2211) 06-04 10:57:44.502:E/AndroidRuntime(6610):在android.app.ActivityThread.access$600(ActivityThread.java:143) 06-04 10:57:44.502:E/AndroidRuntime(6610):在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1209) 06-04 10:57:44.502:E/AndroidRuntime(6610):在android.os.Handler.dispatchMessage(Handler.java:99)上 06-04 10:57:44.502:E/AndroidRuntime(6610):在android.os.Looper.loop(Looper.java:137) 06-04 10:57:44.502:E/AndroidRuntime(6610):位于android.app.ActivityThread.main(ActivityThread.java:4965) 06-04 10:57:44.502:E/AndroidRuntime(6610):位于java.lang.reflect.Method.Invokenactive(本机方法) 06-04 10:57:44.502:E/AndroidRuntime(6610):在java.lang.reflect.Method.invoke(Method.java:511) 06-04 10:57:44.502:E/AndroidRuntime(6610):在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791) 06-04 10:57:44.502:E/AndroidRuntime(6610):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558) 06-04 10:57:44.502:E/AndroidRuntime(6610):在dalvik.system.NativeStart.main(本机方法) 06-04 10:57:44.502:E/AndroidRuntime(6610):由以下原因引起:java.lang.NullPointerException 06-04 10:57:44.502:E/AndroidRuntime(6610):位于com.vine.android.vineApplication.getHttpUserAgent(未知来源) 06-04 10:57:44.502:E/AndroidRuntime(6610):在com.vine.api.apichttpclient(未知来源)
嗯,可能您需要将JAR添加到类加载器中,然后像Java上一样生成Class.forName

这里举个例子

public static ClassLoader loadExternalJar(File file) throws Exception {
        if (file.exists()) {
            Method method = URLClassLoader.class.getDeclaredMethod("addURL", new Class[]{URL.class});
            method.setAccessible(true);
            ClassLoader retClassLoader;

            retClassLoader = Thread.currentThread().getContextClassLoader();

            method.invoke(retClassLoader, new Object[]{file.toURI().toURL()});
            return retClassLoader;
        } else {
            throw new Exception("File not found with JAR:"+file.getAbsolutePath());
        }
    }
然后尝试调用Class.forName(“com.vine.api.apichttpclient”)

试试这个:

 try {
        Class<?> someApiClass = Class.forName("com.vine.api.ApiHttpClient");
        if (someApiClass != null) {
            ApiHttpClient localApiHttpClient = (ApiHttpClient) someApiClass
                    .newInstance();
            if (localApiHttpClient != null) {
                // TODO Oeprations
                Log.d("loadState", "Result is Good");
            } else {
                Log.d("loadState", "Result is null");
            }
        }
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InstantiationException e) {
        e.printStackTrace();
    }
试试看{
类someApiClass=Class.forName(“com.vine.api.apichttpclient”);
if(someApiClass!=null){
ApiHttpClient localApiHttpClient=(ApiHttpClient)someApiClass
.newInstance();
if(localApiHttpClient!=null){
//待办事项
Log.d(“加载状态”,“结果良好”);
}否则{
Log.d(“加载状态”,“结果为空”);
}
}
}catch(classnotfounde异常){
e、 printStackTrace();
}捕获(非法访问例外e){
e、 printStackTrace();
}捕获(实例化异常e){
e、 printStackTrace();
}

这里的
是什么?活动?简单课?我们能多看一点吗?什么是空的?上下文或ApiHttpClient?是,“MainActivity扩展活动”,它没有加载ApiHttpClient加载结果为空,但不是上下文。您确定已注册该服务
com.vine.api.ApiHttpClient
?已注册吗?我不知道如何注册)但它存在。jar文件作为库添加到eclipse中,我可以从中查看所有类,但加载时,结果是null.tryed Class.forName?结果如何?它不能为空。如果Jar加载为Library.Class.forName(“com.vine.api.ApiHttpClient”)->06-04 10:46:13.582:W/dalvikvm(5935):异常Ljava/lang/NullPointerException;初始化Lcom/vine/api/ApiHttpClient时抛出;在com.vine.android.vineApplication.getHttpUserAgent(未知源代码)中编辑答案、尝试代码、日志中的内容(以及异常尝试catch add)等错误,这可能是必须使用参数调用的构造函数。这是真的吗?
 try {
        Class<?> someApiClass = Class.forName("com.vine.api.ApiHttpClient");
        if (someApiClass != null) {
            ApiHttpClient localApiHttpClient = (ApiHttpClient) someApiClass
                    .newInstance();
            if (localApiHttpClient != null) {
                // TODO Oeprations
                Log.d("loadState", "Result is Good");
            } else {
                Log.d("loadState", "Result is null");
            }
        }
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InstantiationException e) {
        e.printStackTrace();
    }