2014-03-05 36 views
0

首先是一些背景(當人們提問時我總是喜歡):我在寫一個庫項目。這是一個簡單的OpenGL'圖形失真'庫。用戶應該能夠創建一個名爲「地區」用一個簡單的調用某些對象,以Android庫項目:需要檢索沒有上下文的資源

myRegion = new DistortedRegion(w,h); 

然後對他們的定義各種扭曲和吸引他們:

myRegion.addTwistDistortion(...) 
myRegion.draw(x,y); 

這一切就是這麼簡單。該庫使用OpenGL以各種用戶定義的方式繪製區域(真正的矩形位圖)。

現在,問題是:庫需要在'raw'文件夾中訪問它的頂點和片段着色器,這是與其資源一起存儲的.glsl文件。爲了做到這一點,我們必須訪問Resources對象,爲了做到這一點,我們AFAIK必須擁有Context對象。所以目前,因爲它代表庫必須首先用電話

Distorted.init(Context) 

這對我來說是一個巨大的問題進行初始化,因爲這恕我直言,使得整個API笨拙。如果不是這個該死的上下文,就沒有必要初始化任何東西,並且用戶只要能夠隨時創建新對象就可以了,這在文檔中很好解釋。一個單獨的init()調用,僅僅需要將Context對象傳遞給庫,只需要檢索Resources對象(僅用於打開包含着色器代碼的兩個文件)纔會使所有這些非常笨拙。我想在我的庫中簡單地將着色器代碼移動到靜態初始化的字符串中,但是這對於開發來說很麻煩(着色器是幾百行相當複雜的代碼,並且如果我將它們保存在單獨的代碼中)。 glsl文件,我可以有句法highliting等)

有什麼建議嗎?

+0

它甚至可以將資源包含在庫中嗎? – mach

+0

當然這是可能的。我在做:) – Utumno

+0

我在想.jar/.so – mach

回答

0

所以是的,我希望能夠解決它。這是一個通過反射直接調用底層Android代碼來返回當前應用程序的上下文的函數。它可以從任何地方調用,不僅可以從擴展應用程序或活動的類中調用:

import android.content.Context; 
import android.app.Application; 
import java.lang.reflect.Method; 

private Context getCurrentContext() 
    { 
    Class<?>  cl =null;  
    Method method =null; 
    Application app =null; 

    try 
    { 
    cl = Class.forName("android.app.AppGlobals");  
    } 
    catch(ClassNotFoundException ex) 
    { 
    Log.e(TAG_DISTORTED_REGION, "Failure to retrieve the AppGlobals class: "+ex.toString()); 
    return null; 
    } 

    try 
    { 
    method = cl.getMethod("getInitialApplication", (Class [])(null)); 
    } 
    catch(NoSuchMethodException nm) 
    { 
    Log.e(TAG_DISTORTED_REGION, "No such method: "+nm.toString()); 
    return null; 
    } 

    try 
    { 
    app = (Application)method.invoke(null, (Object [])(null)); 
    } 
    catch(Exception e) 
    { 
    Log.e(TAG_DISTORTED_REGION, "failure calling method getInitialApplication: "+e.toString()); 
    return null; 
    } 

    return app.getApplicationContext(); 
    } 
+0

該死的。這隻適用於Android 4.4和4.3。 4.2和4.1給我一個NullPointerException嘗試getApplicationContext()。 – Utumno