我有一个 Java 类,其中有一个必须从 C 代码调用的函数。
函数如下:
public void endTrial(){
//Code
}
所以我在我的 C 文件中创建了以下代码:
JNIEXPORT void JNICALL package_endTrialJava();
JNIEXPORT void JNICALL package_endTrialJava(){
jobject javaObjectRef = env->NewObject(javaClassRef, javaMethodRef);
env->CallVoidMethod(javaObjectRef, javaMethodRef);
}
但是为了能够调用这个函数env
变量,我创建了这个函数,每当我启动程序时都会调用该函数。
JNIEXPORT void JNICALL package_initJNI(JNIEnv* en, jobject ob)
{
try {
// LOGD("(JNI) [FluidMechanics] loadVelocityDataSet()");
if (!App::getInstance())
throw std::runtime_error("init() was not called");
if (App::getType() != App::APP_TYPE_FLUID)
throw std::runtime_error("Wrong application type");
FluidMechanics* instance = dynamic_cast<FluidMechanics*>(App::getInstance());
android_assert(instance);
jclass dataClass = en->FindClass("fr/limsi/ARViewer/MainActivity");
javaClassRef = (jclass) env->NewGlobalRef(dataClass);
javaMethodRef = env->GetMethodID(javaClassRef, "endTrial", "()V");
env = en ;
obj = ob ;
} catch (const std::exception& e) {
throwJavaException(env, e.what());
}
}
我也在代码中声明了这些全局变量,以便对 initJNI() 的调用可以存储 JNIEnv 变量。
JNIEnv* env ;
jobject obj ;
但我的程序崩溃了,所以看起来存储JNIEnv
变量不起作用。那有什么解决办法吗?