[英]Issues calling C++ from Java code (Android)
我正在嘗試使用ndk從android代碼調用本機函數,並且遇到了一些問題。 該應用程序將運行一小段時間,然后出現一條錯誤消息,指出“它已意外停止”。 Logcat揭示這是由於UnsatisfiedLinkError: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()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.