4

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

3 に答える 3

6

これを使用してフィールドを取得する必要があると思います:

env->GetFieldID( clazz, "mType", "Lcom/grepwise/pongdroid/ShaderType;" );
env->GetFieldID( clazz, "mShaderSrc", "Ljava/lang/String;" )

そして、ループから抜け出すクラスとフィールドを移動します。

編集:これも:

const jchar jShaderChr = env->GetCharField(...)

mShaderSrc から文字列値を取得するのは間違っています。

以下を使用する必要があります。

jstring jShaderStr = (jstring)env->GetObjectField(...);
const char* shaderSrc = env->GetStringUTFChars(jShaderStr, 0);
// ... here use shaderSrc
env->ReleaseStringUTFChars(hShaderStr, shaderSrc);
于 2012-04-26T05:58:01.210 に答える
2

インスタンスからプライベート フィールドを取得し、署名を 3 番目の引数として渡す必要があります。

jfieldID field = env->GetFieldID( obj, "mShaderSrc", "Ljava/lang/String;" );
于 2012-04-26T05:58:37.520 に答える
0

私は問題を解決しました:Eclipseは私のクラスパスを認識していませんでした。誰かが同様の問題を抱えている場合は、[ウィンドウ] -> [設定] -> [Java] -> [ビルド パス] -> [クラスパス] に移動し、使用している Android SDK プラットフォームへのクラスパスと、プロジェクトのクラスへのパスを追加する必要があります。ルート (例: $PROJECT_ROOT/bin/classes)。

于 2012-04-27T14:43:08.223 に答える