не удалось выполнить этот код C ++ на Android - PullRequest
2 голосов
/ 09 июня 2011

Я пытаюсь вызвать нативные методы opengl из Java.Все компилируется нормально, но я все еще получаю эту ужасную ошибку в журнале android cat

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

в соответствии с oracle

UnsatisfiedLinkError выбрасывается, если виртуальная машина Java не можетнайти подходящее определение на родном языке метода, объявленного как родной

Я не могу понять, почему эмулятору не удается найти мои собственные методы.// нативные методы в 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();
}

Пожалуйста, помогите Ссылка для скачивания файлов проекта

1 Ответ

10 голосов
/ 09 июня 2011

Поскольку ваш файл является файлом cpp, вам понадобится extern "C" { } для экспортируемых функций.В противном случае компилятор будет искажать имена функций, а Java не найдет искомые.

...