2014-03-05 38 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