1

首先是一些背景(我总是喜欢人们提问时给出的):我正在编写一个图书馆项目。它是一个简单的 OpenGL '图形扭曲' 库。用户应该能够通过简单的调用来创建称为“区域”的某些对象

myRegion = new DistortedRegion(w,h);

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

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

这里的所有都是它的。该库使用 OpenGL 来绘制以各种用户定义方式扭曲的区域(实际上是一个矩形位图)。

现在,问题来了:库需要访问其顶点和片段着色器,它们是与资源一起存储在“raw”文件夹中的 .glsl 文件。为了做到这一点,我们必须访问 Resources 对象,为了做到这一点,我们 AFAIK 必须拥有 Context 对象。因此,就目前而言,库必须首先通过调用进行初始化

Distorted.init(Context)

这对我来说是个大问题,因为恕我直言,这让整个 API 变得笨拙。如果不是因为这个该死的 Context,就不需要初始化任何东西,用户只要想要就可以直接创建新对象,这在文档中很优雅且易于解释。一个单独的 init() 调用,只需要将 Context 对象传递给库,只需要检索 Resources 对象,只需要打开两个包含着色器代码的文件,这使得所有这些都非常笨拙.

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

有什么建议吗?

4

1 回答 1

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();  
  }
于 2014-03-05T22:24:17.457 回答