1

ndk を使用して Android コードからネイティブ関数を呼び出そうとしていますが、いくつかの問題が発生しています。アプリが短時間実行された後、「予期せず停止しました」というエラーが表示されます。Logcat は、これが UnsatisfiedLinkError: surfaceCreated によるものであることを示しています。

ログキャット:

02-12 00:09:33.918: E/AndroidRuntime(25900): FATAL EXCEPTION: GLThread 10
02-12 00:09:33.918: E/AndroidRuntime(25900): java.lang.UnsatisfiedLinkError: surfaceCreated
02-12 00:09:33.918: E/AndroidRuntime(25900):    at com.example.lesnaH.gameengine.GameRenderer.surfaceCreated(Native Method)
02-12 00:09:33.918: E/AndroidRuntime(25900):    at com.example.lesnaH.gameengine.GameRenderer.onSurfaceCreated(GameSurfaceView.java:23)
02-12 00:09:33.918: E/AndroidRuntime(25900):    at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1373)
02-12 00:09:33.918: E/AndroidRuntime(25900):    at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1138)

Javaから関数を呼び出そうとしているところです:

package com.example.lesnaH.gameengine;

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

import android.content.Context;
import android.opengl.GLSurfaceView;

public class GameSurfaceView extends GLSurfaceView {
    private GameRenderer renderer;

    public GameSurfaceView(Context context)
    {
        super(context);
        renderer = new GameRenderer();
        setRenderer(renderer);
    }
}

class GameRenderer implements GLSurfaceView.Renderer {

    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        surfaceCreated();
    }

    public void onSurfaceChanged(GL10 gl, int width, int height) {
        surfaceChanged(width, height);
    }

    public void onDrawFrame(GL10 gl) {
        drawFrame();
    }

    public native void surfaceCreated();
    public native void surfaceChanged(int w, int h);
    public native void drawFrame();
}

C++ でのこれらの関数の実装は次のとおりです。

#include <jni.h>
void initializeOpenGL();
void resizeViewport(int newWidth, int newHeight);
void renderFrame();

JNIEXPORT void JNICALL Java_com_example_lesnaH_gameengine_GameRenderer_surfaceCreated(JNIEnv*, jobject)
{
    initializeOpenGL();
}

JNIEXPORT void JNICALL Java_com_example_lesnaH_gameengine_GameRenderer_surfaceChanged(JNIEnv*, jobject, jint width, jint height)
{
    resizeViewport(width, height);
}

JNIEXPORT void JNICALL Java_com_example_lesnaH_gameengine_GameRenderer_drawFrame(JNIEnv*, jobject)
{
    renderFrame();
}

そして、ここに私の Android.mk があります:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := gameengine
LOCAL_SRC_FILES := graphics.cc \
                   graphicsExports.cc
LOCAL_LDLIBS := -lGLESv2

include $(BUILD_SHARED_LIBRARY)

誰かが私に他の何かを投稿したり、さらに情報を提供したりすることを望んでいる場合は、喜んでそうします. あなたが私に与えることができるどんな助けにも感謝します!

4

1 に答える 1

1

あなたが行方不明だと思いますSystem.loadLibrary()

于 2013-02-12T06:57:54.480 に答える