android 单例模式 调用方法,Android jni不使用单例模式

博客内容讲述了作者在Android应用中从使用FJpegStreamReader的单例模式转向实例化过程中遇到的问题。在尝试创建两个独立的FJpegStreamReader对象来打开不同文件时,其中一个对象在调用open方法时遇到了错误。C++的openFile方法返回了错误码-1001,表明文件打开失败。这可能是由于文件路径、文件存在状态或并发访问控制的问题导致的。
摘要由CSDN通过智能技术生成

我有一个班级叫

FJpegStreamReader

,已加载jni(.so):

System.loadLibrary("fjpeg");

并且有一个单例构造函数:

private static volatile FJpegStreamReader mInstances;

public static FJpegStreamReader getInstance() {

if (mInstances == null) {

synchronized (FJpegStreamReader.class) {

if (mInstances == null) {

mInstances = new FJpegStreamReader();

}

}

}

return mInstances;

}

当我用singleton调用它时,效果很好,

FJpegStreamReader.getInstance().open("/sdcard/markers.jpg", FJpeg.MODEL_OPEN);

但现在,我不想使用单例模式,我试图改变

FJPEG流读取器

FJpegStreamReader readerA = new FJpegStreamReader();

FJpegStreamReader readerB = new FJpegStreamReader();

readerA.open("/sdcard/markers1.jpg", FJpeg.MODEL_OPEN);

readerB.open("/sdcard/markers2.jpg", FJpeg.MODEL_OPEN);

Bitmap bmA = readerA.getBackgroundImage();

Bitmap bmB = readerB.getBackgroundImage();

25884-25884 I: JNI_OnLoad Called

25884-25884 I: FilePath: /sdcard/markers1.jpg, and OpenMode: 0

25884-25884 I: offset isï¼15079

25884-25884 I: Start to Parser Data

25884-25884 I: Open Succeed

25884-25884 I: FilePath: /sdcard/markers2.jpg, and OpenMode: 0

25884-25884 E: Fired to Open File(code: -1001)

这是我的

c++

方法:

unique_ptr f(new FJpeg);

static jboolean

FJpeg_open(JNIEnv *env, jobject thiz, jstring fileName, jint model) {

const char *c_path = NULL;

c_path = env->GetStringUTFChars(fileName, NULL);

LOG_I("FilePath: %s, and OpenMode: %d", c_path, model);

int rel = f->openFile(c_path, model);

if (rel < 0) {

LOG_E("Fired to Open File(code: %d)", rel);

return false;

}

LOG_I("Open Succeed");

return true;

}

...

int FJpeg::openFile() {

if (file_path == NULL || *file_path == '\0' || (open_mode != 0 && open_mode != 1)) return ERROR_CODE_UNSUPPORTED_OPERAND;

if (open_mode == 0) {

f_in.open(file_path, ios::in | ios::binary);

if (f_in.fail()) return ERROR_CODE_FILE_NOT_FOUND;

return checkOffsetAndEnd();

} else {

f_out.open(file_path, ios::out | ios::binary);

if (f_out.fail()) return ERROR_CODE_FILE_NOT_FOUND;

return 0;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值