gpt4 book ai didi

c++ - 无法在 android 上执行此 c++ 代码

转载 作者:太空狗 更新时间:2023-10-29 23:42:02 25 4
gpt4 key购买 nike

我正在尝试从 Java 调用 native opengl 方法。一切都编译正常,但我仍然在 android log cat 中遇到这个可怕的错误

ERROR/AndroidRuntime(536): java.lang.UnsatisfiedLinkError:init
at com.deo.Glut.Init(Native Method)

根据 oracle

UnsatisfiedLinkError is Thrown if the Java Virtual Machine cannot find an appropriate native-language definition of a method declared native

我不明白为什么模拟器无法找到我的 native 方法。//glut.cpp(jni/glut.cpp)中的原生方法

#include<jni.h>//compiled using cgwin and ndk-build on windows xp
#include<gles/gl.h>
#include<math.h>

static void gluPerspective(GLfloat fovy, GLfloat aspect,
GLfloat zNear, GLfloat zFar)//android ndk lacks glu tool kit (unbelievable)
{
#define PI 3.1415926535897932f
GLfloat xmin, xmax, ymin, ymax;

ymax = zNear * (GLfloat)tan(fovy * PI / 360);
ymin = -ymax;
xmin = ymin * aspect;
xmax = ymax * aspect;

glFrustumx((GLfixed)(xmin * 65536), (GLfixed)(xmax * 65536),
(GLfixed)(ymin * 65536), (GLfixed)(ymax * 65536),
(GLfixed)(zNear * 65536), (GLfixed)(zFar * 65536));
#undef PI
}

JNIEXPORT void JNICALL Java_com_deo_Glut_display
(JNIEnv *, jobject)
{
glClearColor(1,1,0,1);
glClear(GL_COLOR_BUFFER_BIT);
}

JNIEXPORT void JNICALL Java_com_deo_Glut_reshape
(JNIEnv *, jobject, jint width, jint height)
{
glViewport(0,0,width,height);
if(height==0)height=1;//prevent a divide by zero error in case it ever tries to occur
glMatrixMode(GL_PROJECTION);
gluPerspective(50,width/height,1,1000);
glMatrixMode(GL_MODELVIEW);
}

JNIEXPORT void JNICALL Java_com_deo_Glut_init
(JNIEnv *, jobject)
{}

我首先声明然后尝试从导致错误的 java 调用上述方法。

package com.deo;
public class Glut//java class that declares my native methods(src\com\deo\Glut.java)
{
static
{
System.loadLibrary("glut");
}
public native void display();
public native void reshape(int width, int height);
public native void init();//this is somehow generating an error :(
}

然后尝试从我的自定义渲染器中调用它们

public Glut myglut;
public void onSurfaceCreated(GL10 gl, EGLConfig config)
{ myglut= new Glut();
myglut.init();
}

请帮忙 download link to project files

最佳答案

因为您的文件是 cpp 文件,所以您需要在导出的函数周围使用 extern "C"{ }。否则,编译器将破坏函数名称,Java 将找不到它正在寻找的函数名称。

关于c++ - 无法在 android 上执行此 c++ 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6289970/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com