コードなどを投稿する前に、私が達成しようとしていることを説明しましょう。私がやろうとしているのは、アセットフォルダーからロードシェーダーを取得し、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)