gpt4 book ai didi

java - 为什么当通过 JNI 在 Java 代码中运行 EGL 函数时,我对 EGL 函数的调用会发生变化?

转载 作者:行者123 更新时间:2023-11-28 06:46:52 26 4
gpt4 key购买 nike

我正在用 opengl 和 java/android 做一些工作。我在 C++ 中有一些代码,并且正在使用 JNI 在两者之间进行交互。我得到结果:

D/App     ( 2966): eglGetCurrentDisplay() 1
D/App ( 2966): thread id from c++ 2920
D/dalvikvm( 2966): threadid=11: interp stack at 0x613c5000
D/dalvikvm( 2966): init ref table
D/dalvikvm( 2966): init mutex
D/dalvikvm( 2966): create JNI env
D/dalvikvm( 2966): create fake frame
D/dalvikvm( 2966): threadid=11: adding to list (attached)
D/dalvikvm( 2966): threadid=11: attached from native, name=(null)
D/App ( 2966): thread id 2920
D/App ( 2966): EGL.eglGetCurrentDisplay is com.google.android.gles_jni.EGLDisplayImpl@0

来自下面的代码。这意味着当我进入 JNI 时当前显示正在改变。为什么会这样?线程没有改变,我相信线程本地存储是驱动程序存储此信息的地方。

C++代码:

printf("eglGetCurrentDisplay() %x\n", eglGetCurrentDisplay());
printf("thread id from c++ %d\n", (int)gettid());
int ret = Call_Java<int>("JNITest", "(I)I", 0 );

template<typename T>
T Call_Java(const char* sMethodName, const char* sMethodArgs, ...)
{
JavaVM *g_javaVMcached;
va_list argp;
jint res;

jobject obj;
getJavaCache(&obj, &g_javaVMcached);
assert(obj != 0);

JNIEnv * env = 0;
res = g_javaVMcached->AttachCurrentThread( &env, 0 );
assert( res == 0 && env != 0 )

jclass clazz = 0;
clazz = env->GetObjectClass( obj );
assert( clazz != 0 )

jmethodID methodID = env->GetMethodID( clazz, sMethodName, sMethodArgs ); // Name + Args
assert( methodID != 0 )

va_start(argp, sMethodArgs);
T result=0;
result = callJNIMethod<T>(obj, env, methodID, argp);
va_end(argp);

env->DeleteLocalRef( clazz );
return result;
}

template <>
int callJNIMethod(const jobject & obj, JNIEnv *env, jmethodID methodID, va_list args)
{
return env->CallIntMethodV(obj, methodID, args);
}

Java代码:

int JNITest(int test)
{
Log.d(TAG, "thread id " + (int)android.os.Process.myTid());
EGLDisplay disp = EGL.eglGetCurrentDisplay();
Log.d(TAG, "EGL.eglGetCurrentDisplay is " + disp);
return 0;
}

最佳答案

在 C++ 代码中,EGL 显示是一个简单的整数。在 Java 代码中,EGL 显示是一个对象。这些碰巧打印不同。

Android 目前只定义了默认显示。

关于java - 为什么当通过 JNI 在 Java 代码中运行 EGL 函数时,我对 EGL 函数的调用会发生变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24826617/

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