0

NDK から openGL es サーフェスをレンダリングしようとしていますが、作業の早い段階で停止しました。NDK の 3d の例に似たセットアップがあります。GLSurface ビューから継承するクラスと、GLSurfaceView.Renderer から継承するクラスがあります。私の .c ファイルには、何もしない単純なメソッドがあります。何も入っていない単なる void 関数です。アクティビティ onCreate メソッドから継承するクラスでこの関数を呼び出すことができます。
プライベート スタティック ネイティブ ボイド nativeSetup();

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    mGLView = new GraphGLSurfaceView(this);
    setContentView(mGLView);
    nativeSetup();
}

プログラムは正常に動作します。ただし、呼び出し (および宣言) を GLSurfaceView クラスの 1 つに入れると、プログラムはすぐに失敗します (nativeSetup が問題の呼び出しです)。ネイティブ コールがなくてもすべて正常に動作することを確認しました (色付きのサーフェスが描画されます)。GLSurface クラスからネイティブ コードを呼び出すことができない理由について、何か考えがある人はいますか?

私のcファイル:

#include <string.h>
#include <jni.h>

void Java_com_test_intro_nativeSetup( JNIEnv*  env ){}

動作しない方法で私のJavaファイル:

package com.test;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.app.Activity;
import android.content.Context;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.util.Log;
import android.view.Window;

public class intro extends Activity {
    static{
        System.loadLibrary("graphrender");
    }
    private GLSurfaceView mGLView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        mGLView = new GraphGLSurfaceView(this);
        setContentView(mGLView);

    }
}

class GraphGLSurfaceView extends GLSurfaceView {
    GraphRenderer mRenderer;    
    public GraphGLSurfaceView(Context context) {
        super(context);
        mRenderer = new GraphRenderer();
        setRenderer(mRenderer);

    }
}

class GraphRenderer implements GLSurfaceView.Renderer { 
    private static native void nativeSetup();
    private float _red = 0.9f;
    private float _green = 0.2f;
    private float _blue = 0.2f;

    public void onSurfaceCreated(GL10 gl, EGLConfig config) {

        Log.d("intro", "Got to intro 4" );
    }

    public void onSurfaceChanged(GL10 gl, int w, int h) {
        gl.glViewport(0, 0, w, h);
        nativeSetup();
        //Log.d("intro", "Got to intro 2" + debugStr);
    }

    public void onDrawFrame(GL10 gl) {
        Log.d("intro", "Got to intro 3");
        gl.glClearColor(_red, _green, _blue, 1.0f);
        // clear the color buffer to show the ClearColor we called above...
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
    }
}
4

1 に答える 1

2

C ファイルで、ネイティブ関数の名前を変更しましたか?問題はこの問題に関連している可能性があります。これは、JNI がネイティブ関数に特定の名前を使用しているためです。

ここを見javah -jni $CLASS-FILE-WITH-NATIVE-METHODS$て、cファイルを取得するために使用してみてください。

お役に立てれば。

チャオ

于 2011-02-09T11:46:48.150 に答える