Android JNI C++ 代码总是为 2 个不同的 SurfaceView 对象获取 "same" jobject 值
Android JNI C++ Code always get "same" jobject value for 2 different SurfaceView object
在AndroidJAVA代码中:
public native int addRenderer(int channel, Object glSurface);
Context context = getApplicationContext();
SurfaceView svRemotePartyA = new SurfaceView(context);
SurfaceView svRemotePartyB = new SurfaceView(context);
addRenderer(0, svRemotePartyA);
addRenderer(1, svRemotePartyB);
在 Android JNI C++ 代码中:
extern "C" jint JNIEXPORT JNICALL Java_addRenderer(
JNIEnv* jni,
jobject j_vie,
jint channel,
jobject surface) {
LOG(LS_INFO) << "Java_addRenderer(): surface=" << surface;
// some processing
}
当我运行这个程序的时候,我总是看下面的日志!两个 SurfaceView 对象在 JNI C++ 代码日志输出中具有相同的值:
(render_manager.cc:175): Java_addRenderer(): surface==0xbeed6120
(render_manager.cc:175): Java_addRenderer(): surface==0xbeed6120
有什么问题?
您不应尝试将含义与 JNI 引用的特定位模式相关联。
例如,在 Dalvik 中,局部引用只是堆栈上 table 的索引。如果对不同的对象进行多次相同的调用,每次都会看到相同的 "value" 引用,因为对象引用位于本地引用 table.[= 中的相同位置。 12=]
(并不是那么简单——Dalvik 实际上将一个普通的序列号塞进了引用中,以便更容易判断本地引用在被回收后何时被使用——但你明白了。)
同样,您不能对全局引用做出假设。如果您为同一个对象创建两个全局引用,这些引用很可能具有不同的 32 位值。
每个虚拟机都是不同的。 Dalvik 的旧(ICS 之前)版本实际上传递原始指针,您可以 比较引用值以确定两个对象是否相同。切换到间接引用需要解决一些问题。
如果要判断两个对象是否相同,则需要对两者都有引用,并使用 JNI IsSameObject()
函数。
一些额外的背景是 here。
您查看本地引用,绝不能在同一 JNI 方法的上下文之外使用它们。如果您获得此工作项目的全球参考,您将获得 2 个不同的参考。
在AndroidJAVA代码中:
public native int addRenderer(int channel, Object glSurface);
Context context = getApplicationContext();
SurfaceView svRemotePartyA = new SurfaceView(context);
SurfaceView svRemotePartyB = new SurfaceView(context);
addRenderer(0, svRemotePartyA);
addRenderer(1, svRemotePartyB);
在 Android JNI C++ 代码中:
extern "C" jint JNIEXPORT JNICALL Java_addRenderer(
JNIEnv* jni,
jobject j_vie,
jint channel,
jobject surface) {
LOG(LS_INFO) << "Java_addRenderer(): surface=" << surface;
// some processing
}
当我运行这个程序的时候,我总是看下面的日志!两个 SurfaceView 对象在 JNI C++ 代码日志输出中具有相同的值:
(render_manager.cc:175): Java_addRenderer(): surface==0xbeed6120
(render_manager.cc:175): Java_addRenderer(): surface==0xbeed6120
有什么问题?
您不应尝试将含义与 JNI 引用的特定位模式相关联。
例如,在 Dalvik 中,局部引用只是堆栈上 table 的索引。如果对不同的对象进行多次相同的调用,每次都会看到相同的 "value" 引用,因为对象引用位于本地引用 table.[= 中的相同位置。 12=]
(并不是那么简单——Dalvik 实际上将一个普通的序列号塞进了引用中,以便更容易判断本地引用在被回收后何时被使用——但你明白了。)
同样,您不能对全局引用做出假设。如果您为同一个对象创建两个全局引用,这些引用很可能具有不同的 32 位值。
每个虚拟机都是不同的。 Dalvik 的旧(ICS 之前)版本实际上传递原始指针,您可以 比较引用值以确定两个对象是否相同。切换到间接引用需要解决一些问题。
如果要判断两个对象是否相同,则需要对两者都有引用,并使用 JNI IsSameObject()
函数。
一些额外的背景是 here。
您查看本地引用,绝不能在同一 JNI 方法的上下文之外使用它们。如果您获得此工作项目的全球参考,您将获得 2 个不同的参考。