2013-06-04 2 views
0

У меня есть упакованная библиотека .jar, и я хочу получить от него один класс.
, но в параметре это необходимо Context, я новичок в android dev). Пробовался (this) на MainActivity, но результат null. Можете ли вы объяснить, почему это происходит и как исправить?Параметр контекста приложения для Android

Вот пример кода:

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): FATAL EXCEPTION: main 
06-04 10:57:44.502: E/AndroidRuntime(6610): java.lang.ExceptionInInitializerError 
06-04 10:57:44.502: E/AndroidRuntime(6610):  at java.lang.Class.classForName(Native Method) 
06-04 10:57:44.502: E/AndroidRuntime(6610):  at java.lang.Class.forName(Class.java:217) 
06-04 10:57:44.502: E/AndroidRuntime(6610):  at java.lang.Class.forName(Class.java:172) 
06-04 10:57:44.502: E/AndroidRuntime(6610):  at com.example.dfgdf.MainActivity.onCreate(MainActivity.java:59) 
06-04 10:57:44.502: E/AndroidRuntime(6610):  at android.app.Activity.performCreate(Activity.java:5008) 
06-04 10:57:44.502: E/AndroidRuntime(6610):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
06-04 10:57:44.502: E/AndroidRuntime(6610):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2140) 
06-04 10:57:44.502: E/AndroidRuntime(6610):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2211) 
06-04 10:57:44.502: E/AndroidRuntime(6610):  at android.app.ActivityThread.access$600(ActivityThread.java:143) 
06-04 10:57:44.502: E/AndroidRuntime(6610):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1209) 
06-04 10:57:44.502: E/AndroidRuntime(6610):  at android.os.Handler.dispatchMessage(Handler.java:99) 
06-04 10:57:44.502: E/AndroidRuntime(6610):  at android.os.Looper.loop(Looper.java:137) 
06-04 10:57:44.502: E/AndroidRuntime(6610):  at android.app.ActivityThread.main(ActivityThread.java:4965) 
06-04 10:57:44.502: E/AndroidRuntime(6610):  at java.lang.reflect.Method.invokeNative(Native Method) 
06-04 10:57:44.502: E/AndroidRuntime(6610):  at java.lang.reflect.Method.invoke(Method.java:511) 
06-04 10:57:44.502: E/AndroidRuntime(6610):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791) 
06-04 10:57:44.502: E/AndroidRuntime(6610):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558) 
06-04 10:57:44.502: E/AndroidRuntime(6610):  at dalvik.system.NativeStart.main(Native Method) 
06-04 10:57:44.502: E/AndroidRuntime(6610): Caused by: java.lang.NullPointerException 
06-04 10:57:44.502: E/AndroidRuntime(6610):  at com.vine.android.vineApplication.getHttpUserAgent(Unknown Source) 
06-04 10:57:44.502: E/AndroidRuntime(6610):  at com.vine.api.ApiHttpClient.(Unknown Source) 

+0

Что такое 'this' есть ? Мероприятия ? простой класс? –

+0

Можем ли мы увидеть немного больше? что такое null? контекст или ApiHttpClient? – AMerle

+0

Да, «MainActivity extends Activity», это не загрузка. Результат загрузки ApiHttpClient равен null, но не контексту. – Daniel

ответ

2

Хм, может быть вам нужно добавить JAR в ClassLoader, а затем сделать Class.forName как на Java делать.

Вот пример

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.ApiHttpClient")

Попробуйте это:

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(); 
    } 
+0

jar-файл добавляется как библиотека для eclipse, я могу просматривать все классы из него, но при загрузке результат равен нулю. – Daniel

+0

попробовал Class.forName? Какой результат? Он не может быть нулевым. Если Jar загружен как библиотека. –

+0

Class.forName ("com.vine.api.ApiHttpClient") -> 06-04 10: 46: 13.582: W/dalvikvm (5935): Исключение Ljava/lang/NullPointerException; выбрасывается при инициализации Lcom/vine/api/ApiHttpClient; – Daniel

Смежные вопросы