我正在尝试将现有的opencv项目移植到Android。但是在c ++的当前实现中,我在程序启动时加载了cascadeClassifier
。但是在android中如果我从onCameraFrame()
调用我的本机函数,那么每次我将帧传递给本机代码时我都必须加载cascadeClassifier
文件,这对于设备来说是很多工作。
有没有办法加载cascadeClassifier
一次然后使用它。我的意思是像在java中加载它并将其传递给jni调用或任何其他替代方案。 (我尝试将加载的cascadeClassifier
从java传递给jni调用,但我是ndk的新手。所以我无法这样做)。我想这样做是因为每帧加载4个cascadeClassifier
会使应用程序变成chopy。
谢谢
您可以尝试在Singleton中将实例缓存在Java端,并使用JNI方法从JNI层返回它,例如:你有一个Java类CascadeClassifierCacher
如下
package com.arophix.jniexample.jniobjects;
public class CascadeClassifierCacher {
private static CascadeClassifier cascadeClassifierCache = null;
public static CascadeClassifier getCacheInstance() {
if(cascadeClassifierCache == null) {
cascadeClassifierCache = new CascadeClassifier();
}
return cascadeClassifierCache;
}
}
从JNI方面,您可以使用以下流程来引用它:(知道您的完全限定的包名称是com.arophix.jniexample.jniobjects.CascadeClassifierCacher
)
// Find the CascadeClassifierCacher class
jclass clazzId = env->FindClass("com/arophix/jniexample/jniobjects/CascadeClassifierCacher");
// Get the methodID
jmethodID jmethodIdGetCache = env->GetMethodID(clazz, "getCacheInstance", "()Lcom/arophix/jniexample/jniobjects/CascadeClassifierCacher;");
// Call getCacheInstance method.
jobject cacheInstance = (jobject) env->CallStaticObjectMethod(clazzId, jmethodIdGetCache);
然后你可以在你的JNI方面使用cacheInstance
。