Android库项目:需要在没有Context的情况下检索资源

时间:2014-03-05 11:41:25

标签: android opengl-es openglcontext

首先是一些背景(我总是喜欢当人们提问时):我正在写一个图书馆项目。这是一个简单的OpenGL'图形扭曲'图书馆。用户应该能够创建称为“区域”的特定对象。只需调用

即可
myRegion = new DistortedRegion(w,h);

然后定义各种扭曲并绘制它们:

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

这就是它的全部内容。该库使用OpenGL以各种用户定义的方式绘制区域(真正的矩形位图)。

现在,问题是:库需要访问其顶点和片段着色器,这些着色器是与其资源一起存储的.glsl文件,位于' raw'夹。为了做到这一点,我们必须访问Resources对象,为了做到这一点,我们AFAIK必须拥有Context对象。所以目前看来,首先要通过调用来初始化库

Distorted.init(Context)

这对我来说是一个巨大的问题,因为这个恕我直言使整个API笨拙。如果没有这个该死的上下文,就没有必要初始化任何内容,用户只需要随时就可以创建新对象,这在文档中很容易解释。一个单独的init()调用,只需要将Context对象传递给库,只需要检索Resources对象,只需打开包含着色器代码的两个文件,就会使所有这些都非常笨拙

我想简单地将着色器代码移动到我的库中的静态初始化字符串中,但这对于开发来说很麻烦(着色器是数百行长的相当复杂的代码,如果我将它们保存在单独的.glsl中文件,我可以在其他方面有语法高亮)

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

所以是的,我希望能把它搞清楚。这是一个通过反射直接调用底层Android代码来返回当前Application的Context的函数。它可以从任何地方调用,而不仅仅是扩展Application或Activity的类:

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