从Java代码调用C++的问题(Android)

Issues calling C++ from Java code (Android)

本文关键字:问题 Android C++ Java 代码 调用      更新时间:2023-10-16

我正试图使用ndk从android代码中调用本机函数,但遇到了一些问题。该应用程序将运行一小段时间,然后出现一个错误,表明它"已意外停止"。Logcat显示这是由于不满意的链接错误:surfaceCreated。

Logcat:

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)

如果有人想让我发布其他内容/提供更多信息,我很乐意。非常感谢你能给我的任何帮助!

我想您缺少System.loadLibrary()