2011-02-09 11 views
0

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

プログラムは正常に動作します。しかし、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); 
    } 
} 

答えて

2

あなたのCファイルには、あなたのネイティブ関数の名前を変更しなかったかもしれない問題は、この問題に関連していますJNIは、navtive関数に特定の命名規則を使用します。

hereを見て、javah -jni $CLASS-FILE-WITH-NATIVE-METHODS$を使用してcファイルを取得しようとします。

これが役に立ちます。

ciao

+0

私はこのクラスの名前を変更するのを忘れました。ありがとうございました。 – Hohohodown