2011-03-14 78 views
8

我剛剛開始在Android上使用OpenGL ES(使用this book),並遇到了從第5章採用source代碼到現有的在Android中使用jni的方法的問題(實際上,它也是擔心簡單地運行本地GL應用程序)。我試圖編譯本地代碼以獲取.so lib並在.apk存檔中進一步使用它。但是如果某些庫不存在(GLES/gl.h,EGL/egl.h,GLES/gl.h,GLES/glext.h),編譯是不可能的。安裝OpenGL ES和編譯代碼Android

所以問題是我該如何安裝這些庫(AFAIU,OpenGL ES和EGL安裝)並編譯最普通的本地代碼? (教程非常值得推崇)。

在此先感謝。

編輯:我試過glbuffer例如建議(稍微改變.mk文件),但仍然沒有成功。編譯器給我相同的結果之前:

ndk-build

Compile thumb: egl <= cube.c

/path/jni/cube.c:5:21: error: GLES/gl.h: No such file or directory // same message for glbuffer when gl.h is being included

這裏是cube.c代碼:

#include <unistd.h> 
#include <stdlib.h> 
#include <stdio.h> 

#include <GLES/gl.h> 

#define FIXED_ONE 0x10000 
#define one 1.0f 

typedef unsigned char byte; 

extern void jni_printf(char *format, ...); 

// Cube static 
GLfloat vertices[24] = {  -one, -one, -one,  one, -one, 
-one,  one, one, -one,  -one, one, -one,  -one, -one, one,  one, -one, one,  one, one, one,  -one, one, one, }; 

static GLfloat colors[] = {   0, 0, 0, one,  one, 0, 0, one,  one, one, 0, one,  0, one, 0> , one,  0, 0, one, one,  one, 0, one, one,   one, one, one, one,  0, one, one, one, }; 

static byte indices[] = {  0, 4, 5, 0, 5, 1,   1, 5, 6, 1, 6, 2,  2, 6, 7, 2, 7, 3,  3, 7, 4, 3, 4, 0,  4, 7, 6, 4, 6, 5,  3, 0, 1, 3, 1, 2 }; 


void Cube_draw() { 
glFrontFace(GL_CW); 
glVertexPointer(3, GL_FLOAT, 0, vertices); 
glColorPointer(4, GL_FLOAT, 0 , colors); 
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_BYTE, indices); } 

這是非常微不足道的,而不是來工作,但是。

Android.mk:由Android本身提供

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_LDLIBS := -lGLESv1_CM.so 
LOCAL_MODULE := egl 
LOCAL_SRC_FILES := cube.c cuberenderer.c 

include $(BUILD_SHARED_LIBRARY) 
+0

我翻閱了那本書,它使我使用原生代碼。當我開始嘗試時,我只看了一些示例源代碼,拿了一個.mk文件樣本並重命名了一些東西,然後我就開始運行了。那本書是不是沒有理由可笑地過於複雜,或者在最近的NDK發佈之前,你是否必須這樣做? – 2011-03-14 15:53:04

+0

@Poldie,這並不複雜,它只需要雙重修訂。除了它已經過時了一點,所以它告訴了很多快速學習的東西,儘管有用知道。例子工作正常的變化,但當我來到GL我只是不能編譯它。 Java部分工作良好。 – 2011-03-14 18:47:31

回答

17

這些庫。但是,設置您的項目以查找它們並正確編譯您的JNI(本地)代碼可能令人望而生畏。

我建議使用glbuffer作爲起始項目,因爲它會爲您提供一個GLSurfaceView來繪製並設置適當的Android庫。

如果您想從頭開始自己試試,那麼鏈接到Android庫的詳細信息將包含在該項目的jni/Android.mk中。

編輯 - 顯然glbuffer丟失jni/Application.mk。創建它,並把這個裏面:

APP_ABI := armeabi armeabi-v7a 
APP_PLATFORM := android-8 

然後NDK就知道該怎樣在android-8平臺,爲您的包括內。您可以根據需要將其更改爲其他版本。

+0

請參閱編輯的問題。 – 2011-03-14 18:59:03

+0

我也收到這個消息,調查... – 2011-03-14 19:19:43

+0

我能夠成功ndk-建立與我的補充說明 – 2011-03-14 19:23:01

3

我只是說

#include <jni.h> 

到 cube.c & cuberenderer.c

改變

(*g_VM)->AttachCurrentThread (g_VM, (void **) &env, NULL); 

(*g_VM)->AttachCurrentThread (g_VM, (const struct JNINativeInterface ***) &env, NULL); 

我Android.mk:

LOCAL_PATH:= $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_MODULE := libgltest_jni 
LOCAL_CFLAGS := -Werror 
LOCAL_SRC_FILES := cube.c cuberenderer.c 
LOCAL_LDLIBS := -llog 
-lGLESv1_CM 

include $(BUILD_SHARED_LIBRARY) 

我的應用程序。MK:

# The ARMv7 is significanly faster due to the use of the hardware FPU 
APP_ABI := armeabi armeabi-v7a 
APP_PLATFORM := android-9 

並且把它建立在Android的NDK-R6

5

我搜索了NDK的 「EGL/egl.h」 頭文件的實例。這個特定的例子將在Android API級別15上編譯和運行,但其他一些API級別沒有頭文件。

+0

到達這個問題尋找如何編譯' Android中的EGL/egl.h'標頭。這對我有效。使用APP_PLATFORM = android-14編譯 – asloob 2013-06-06 09:40:54

-2

您使用了兩次文件名GLES/glext.h。