在发布任何代码或任何内容之前,让我解释一下我要完成的工作:我要做的是从资产文件夹中获取加载着色器,并将PongDroidShader
对象数组传递给 C++,以便它可以编译和加载它们.
在我的 Java 类中,我有一个函数,它遍历着色器文件夹中的每个着色器文件并解析它,将其加载到一个String
对象中,同时还通过其文件扩展名检查它是哪种着色器类型(例如,一个顶点将有一个.vert
扩展名)。完成此操作后,我将其发送到我的本机compileShaders
函数,该函数接受PongDroidShader
对象数组和数组的大小。
之后,我从 JNI 代码中解析和链接着色器。
到目前为止,我无法让 JNI 识别 Java 代码并将其加载到变量中。到目前为止,我所拥有的如下:
Java 代码
public final class PongDroidShader {
public String mShaderSrc;
public ShaderType mType;
}
private class ShaderHandler {
...
private native void compileShaders(PongDroidShader[] shaders, int shaderCount);
...
JNI/C++ 代码
JNIEXPORT void JNICALL Java_com_grepwise_pongdroid_PongDroid_00024ShaderHandler_compileShaders
(JNIEnv * env, jobject obj, jobjectArray shaders, jint sizeOfShaders) {
for( int i = 0; i < sizeOfShaders; ++i )
{
jclass clazz = env->FindClass( "com/grepwise/pongdroid/PongDroidShader" );
jclass shaderTypeEnum = env->FindClass( "com/grepwise/pongdroid/ShaderType" );
jfieldID field = env->GetFieldID( clazz, "mType", "ShaderType" );
jobject shader = env->GetObjectArrayElement( shaders, i );
const jchar jShaderChr = env->GetCharField( shader, env->GetFieldID( clazz, "mShaderSrc", "java/lang/String" ) );
jstring jShaderStr = env->NewString( &jShaderChr, sizeof( jShaderChr ) );
const char* shaderStr = env->GetStringUTFChars( jShaderStr, 0 );
//TODO implement GL Shader Manipulation and Allocation here
optim::Config::Log::info( "Testing shader: %s", shaderStr );
delete shaderStr;
}
}
为了简单起见,我省略了代码库中存在的很多内容。请注意,即使compileShaders
未显示被调用,它也由将其父类包装为内部私有类的活动类调用。
到目前为止,我的日志输出如下:
04-25 22:20:56.267 11985 11985 D dalvikvm: Trying to load lib /data/data/com.grepwise.pongdroid/lib/libnativepd.so 0x4051c800
04-25 22:20:56.275 11985 11985 D dalvikvm: Added shared lib /data/data/com.grepwise.pongdroid/lib/libnativepd.so 0x4051c800
04-25 22:20:56.322 11985 11985 D dalvikvm: GetFieldID: unable to find field Lcom/grepwise/pongdroid/PongDroidShader;.mType:ShaderType
04-25 22:20:56.322 11985 11985 D dalvikvm: GetFieldID: unable to find field Lcom/grepwise/pongdroid/PongDroidShader;.mShaderSrc:java/lang/String
04-25 22:20:56.330 11985 11985 I dalvikvm: at com.grepwise.pongdroid.PongDroid$ShaderHandler.compileShaders(Native Method)
04-25 22:20:56.330 11985 11985 I dalvikvm: at com.grepwise.pongdroid.PongDroid$ShaderHandler.access$1(PongDroid.java:128)
04-25 22:20:56.330 11985 11985 I dalvikvm: at com.grepwise.pongdroid.PongDroid.onCreate(PongDroid.java:72)