我有一个本机代码的Android应用程序。我如何在调用本地方法之间持有对象的引用?如何在JNI中调用对象之间保持对象?
// 1: create native object and hold it
Object obj = jni_wrapper.native_getObject();
// ... do smth
// 2: return an object back to native code
Object result = jni_wrapper.native_doSmthWithObject(obj);
因此,代码有望保持到一个对象的引用并以某种方式(1之间在上述示例:2和)找到它。我可以创建自己的类和特殊实例字段(如有必要)来保存引用。我使用了下一个解决方案(只是在Index对象的“指针”实例字段中持有指向实例的指针),但它似乎不起作用。
的Java(Index.java):
/**
* CXIndex
*/
public class Index {
private long pointer;
public long getPointer() {
return pointer;
}
}
本地代码:
// index
static jclass IndexClass;
static jmethodID IndexConstructor;
static jfieldID IndexPointerField;
void bindIndex(JNIEnv *env)
{
IndexClass = env->FindClass("name/antonsmirnov/xxx/dto/Index");
IndexConstructor = env->GetMethodID(IndexClass, "<init>", "()V");
IndexPointerField = env->GetFieldID(IndexClass, "pointer", "J");
}
// map CXIndex
jobject mapIndex(JNIEnv *env, CXIndex *index)
{
if (IndexClass == NULL)
bindIndex(env);
jobject obj = env->NewObject(IndexClass, IndexConstructor);
jlong jpointer = reinterpret_cast<jlong>(index);
env->SetLongField(obj, IndexPointerField, jpointer);
return obj;
}
// map Index -> CXIndex
CXIndex unmapIndex(JNIEnv *env, jobject jindex)
{
if (IndexClass == NULL)
bindIndex(env);
jlong jpointer = env->GetLongField(jindex, IndexPointerField);
CXIndex *ptr = reinterpret_cast<CXIndex*>(jpointer);
return *ptr;
}
这涉及到Android能带来哪些具体的行为!
PS。根据http://developer.android.com/training/articles/perf-jni.html – 4ntoine
[标签:编译器构造]与它完全无关,我也不确定持有静态引用是个好主意。 – EJP