我是 Android 和 JNI 的新手。但是在 C/C++ 方面有很好的经验。我想弄清楚以下
将 VS2013 制作的桌面代码移植到 Android。这是一个opencv项目。
我已经移植了大部分性能代码。
但我无法理解如何初始化一些对象并在某个处理步骤的生命周期内保持它们的生命周期。
桌面代码的伪代码
vector<contours*> cntrs // Initialized somewhere else
void ProcessFrame(Mat)
{
LOOP until kb != 'q'
{
step 1 - Extract contours and add them to vector<contours>
step 2 - Display contours
}
}
最佳答案
C++ 中的全局对象是合法的。您可以使用一些特殊的 JNI 调用来初始化它们,或者依赖于 JNI 特定的 JNI_OnLoad(),它保证在您的 native 代码(共享对象,Windows DLL 的 Android 模拟)被加载后调用一次。您还可以让编译器处理此初始化,例如
std::vector<int> global_v { 1, 1, 2, 3, 5, 8 };
package com.demo;
public class FILE {
public void test1 {
long file = fopen("/sdcard/test1", "w");
fputs(file, "abc");
fclose(file);
}
static { System.loadLibrary("FILE"); }
private static native long fopen(String fname, String fmode);
private static native long fwrite(long f, String s);
private static native void fclose(long f);
}
JNIEXPORT jlong JNICALL Java_com_demo_FILE_fopen(JNIEnv *env, jclass cls, jstring fname, jstring fmode)
{
char *szfname = (*env)->GetStringUTFChars(env, fname, 0);
char *szmode = (*env)->GetStringUTFChars(env, fmode, 0);
FILE* f = fopen(szfname, szmode);
(*env)->ReleaseStringUTFChars(env, fmode, szmode);
(*env)->ReleaseStringUTFChars(env, fname, szname);
retrun (jlong)(f);
}
JNIEXPORT jlong JNICALL Java_com_demo_FILE_fputs(JNIEnv *env, jclass cls, jlong jf, jstring s)
{
char *szs = (*env)->GetStringUTFChars(env, s, 0);
FILE* f = reinterpret_cast<FILE*>(jf);
long len = fputs(f, szs);
(*env)->ReleaseStringUTFChars(env, s, szs);
retrun len;
}
JNIEXPORT void JNICALL Java_com_demo_FILE_fclose(JNIEnv *env, jclass cls, jlong jf)
{
FILE* f = reinterpret_cast<FILE*>(jf);
fclose(f);
}
https://stackoverflow.com/questions/23814811/