使用cle 调用opengl的简单例子(android)

本文介绍了一种利用Common Language Extension (CLE)简化OpenGL调用的方法。通过CLE,开发者无需深入理解JNI即可轻松实现Java调用Native共享库。文章提供了一个具体的例子,展示了如何通过CLE在Android上设置和渲染OpenGL,并提供了相关代码片段。

   使用Using common language extension(cle)作为接口组件,编程能够得到很大简化.下面是一个调用opengl的例子,是从ndk example hello-gl2.修改而来,主要是说明cle的调用方法.


 

    c 代码如下:
++ #include "vsopenapi.h"
-- bool setupGraphics(int w, int h) {
++ bool setupGraphics(void *object,int w, int h) {
}

-- void renderFrame() {
++ void renderFrame(void *object) {
}

-- extern "C" {
--    JNIEXPORT void JNICALL Java_com_android_gl2jni_GL2JNILib_init(JNIEnv * env, jobject obj,  jint width, jint height);
--    JNIEXPORT void JNICALL Java_com_android_gl2jni_GL2JNILib_step(JNIEnv * env, jobject obj);
--};

-- JNIEXPORT void JNICALL Java_com_android_gl2jni_GL2JNILib_init(JNIEnv * env, jobject obj,  jint width, jint height)
-- {
--     setupGraphics(width, height);
-- }

-- JNIEXPORT void JNICALL Java_com_android_gl2jni_GL2JNILib_step(JNIEnv * env, jobject obj)
-- {
--     renderFrame();
-- }

++ VS_BOOL StarCoreService_Init(class ClassOfStarCore *starcore)
++ {
++    void *AtomicClass,*step_AtomicFunction,*init_AtomicFunction;
++    class ClassOfBasicSRPInterface *BasicSRPInterface;
++     class ClassOfSRPInterface *SRPInterface;
++    
++    //--init star core
++    BasicSRPInterface = starcore ->GetBasicInterface();    
++    SRPInterface = BasicSRPInterface ->GetSRPInterface(BasicSRPInterface->QueryActiveService(NULL),"","");
++    
++    //---Create Atomic Class, for define function, no attribute 
++    AtomicClass = SRPInterface ->CreateAtomicObjectSimple("TestItem","GLTestClass",NULL,NULL,NULL);
++    step_AtomicFunction = SRPInterface ->CreateAtomicFunctionSimple(AtomicClass,"step","void step();",NULL,NULL,VS_FALSE,VS_FALSE);
++    init_AtomicFunction = SRPInterface ->CreateAtomicFunctionSimple(AtomicClass,"init","VS_BOOL init(VS_INT32 width,VS_INT32 height);",NULL,NULL,VS_FALSE,VS_FALSE);
++     //---Set Function Address
++    SRPInterface -> SetAtomicFunction(init_AtomicFunction,(void *)setupGraphics);
++    SRPInterface -> SetAtomicFunction(step_AtomicFunction,(void *)renderFrame);
++    SRPInterface -> Release();
++    return VS_TRUE;
++ }

++ void StarCoreService_Term(class ClassOfStarCore *starcore)
++ {
++    return;
++ }

Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

# Here we give our module name and sourcefile(s)
LOCAL_CFLAGS += -Wno-write-strings -DENV_ANDROID
LOCAL_CPPFLAGS += -Wno-write-strings -fexceptions -DENV_ANDROID
LOCAL_LDFLAGS += -Wno-write-strings -DENV_ANDROID

LOCAL_C_INCLUDES += ../../../../../android/workspace/include

#--------source file
MODULE_CXXSRCS := gl_code.cpp

LOCAL_SRC_FILES := ${MODULE_CXXSRCS}
LOCAL_LDLIBS := ../../../../../android/workspace/libs/armeabi/libstarlib.a -llog -lGLESv2

LOCAL_MODULE  := gltest

include $(BUILD_SHARED_LIBRARY)  
 
java代码如下:
++ import com.srplab.www.starcore.*;
class GL2JNIView extends GLSurfaceView {
    
++     StarCoreFactory starcore;
++     static StarObjectClass GlObject;

    private void init(boolean translucent, int depth, int stencil) {

++   StarCoreFactory starcore= StarCoreFactory.GetFactory();
++        StarServiceClass Service=starcore._InitSimple("test","123",0,0,"");        
++        Service._CheckPassword(false);
++        Service._DoFile("","/data/data/com.srplabgl.gltest/lib/libgltest.so","");        
++        GlObject = Service._GetObject("GLTestClass")._New();
…        
    }
    private static class Renderer implements GLSurfaceView.Renderer {
        public void onDrawFrame(GL10 gl) {
++            GlObject._Call("step");
        }

        public void onSurfaceChanged(GL10 gl, int width, int height) {
++            GlObject._Call("init",width,height);
        }

        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
            // Do nothing.
        }
}

example code can be downloaded from :   http://www.srplab.com/android/gltest.rar    

   在比较简单的场景下,使用JNI可以容易实现.但在复杂的应用中,就需要程序员自行维护各种引用,回调,进行参数转换. 这些都使得编程工作变得比较复杂. 使用cle能够简化该过程,程序员可以不需要了解JNI,就可以使用java调用native共享库.
    下面的图片为anti-grain geomet在android上的一个封装,基于cle. 不久将会发布
 
更多关于CLE的信息,请访问   http://code.google.com/p/cle-for-android
### 简洁的 Android 代码示例 #### 使用 MVVM 架构与 Jetpack 组件实现用户登录功能 为了提高应用程序的可维护性和测试性,推荐使用MVVM架构模式来分离业务逻辑和UI逻辑[^2]。 ```kotlin // ViewModel 类负责准备并提供 UI 所需的数据,并作为连接 Repository 和 View 的桥梁。 class LoginViewModel(private val loginRepository: LoginRepository) : ViewModel() { private val _loginStatus = MutableLiveData<Boolean>() val loginStatus: LiveData<Boolean> get() = _loginStatus fun loginUser(email: String, password: String) { viewModelScope.launch { // 利用协程简化异步操作 ^[3] try { val result = loginRepository.loginUser(email, password) _loginStatus.value = true } catch (e: Exception) { _loginStatus.value = false } } } } ``` 此 `LoginViewModel` 中利用了 `viewModelScope` 来启动协程执行耗时任务,而无需担心生命周期问题。这不仅使代码更加简洁易读,还提高了性能效率[^3]。 对于视图层(Activity 或 Fragment),可以这样观察状态变化: ```kotlin val viewModel: LoginViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding.viewModel = viewModel binding.lifecycleOwner = this viewModel.loginStatus.observe(this, Observer { isLoggedIn -> if (isLoggedIn) navigateToHomeScreen() }) } ``` 这里采用了双向绑定的方式减少样板代码量,同时也增强了组件间的解耦合度[^1]。 另外,在实际项目中还可以借助于 KTX 库所提供的便捷方法进一步优化编码体验,比如上述例子中的 `viewModels()` 函数就是来自 Activity-KTX/Fragment-KTX 模块的一个扩展函数[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值