фон
У меня есть проект android, который использует JNI (используя NDK) для кодирования как на Java, так и на C/С++.
Я создал java-оболочку java на стороне java, которая сама сделает все Jni-приложения, в то время как никакой другой класс java не сможет получить доступ к jni-операциям, отличным от этой оболочки.
проблема
Проблема заключается в том, что я хочу создать несколько экземпляров этой оболочки, в то время как Jni-часть должна иметь экземпляр для Jni-обертки.
Это проблема, так как Jni-часть содержит те же поля для всех экземпляров.
вопрос
Как я могу решить эту проблему, так что для каждого java-экземпляра jni-оболочки будет экземпляр в jni-части?
Я думал, может быть, я мог бы поместить все поля в класс С++ и иметь функцию init(), которая вернет новый экземпляр для CTOR JniWrapper, а затем, для каждой функции JNI который нуждается в полях, он получит этот класс в качестве параметра. возможно, это может быть указатель, как показано на этой ссылке.
К сожалению, я понятия не имею, как это сделать.
может ли кто-нибудь помочь?
Пример
здесь пример кода, который, я надеюсь, сделает все более ясным для тех, кто не понял проблему:
часть java:
public class JniWrapper
{
static
{
System.loadLibrary("JniTest");
}
private native void foo(Bitmap bitmap);
}
jni часть:
...
// sadly, all of those fields are actually a global fields
int _intField;
float _floatField;
//those are just sample fields. i would also like to store pointers and objects...
JNIEXPORT void JNICALL ...foo(JNIEnv * env, jobject obj, jobject bitmap)
{
// do something with the fields, as if they all belong to the JniWrapper,
// and no other instances of JniWrapper are allowed to change them
}