Skip to content

Commit d4752aa

Browse files
committed
尝试修改C处理线程
1 parent 83baf31 commit d4752aa

6 files changed

Lines changed: 105 additions & 31 deletions

File tree

czxing/src/main/cpp/ImageScheduler.cpp

Lines changed: 49 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,25 +25,44 @@ ImageScheduler::~ImageScheduler() {
2525
delete &frameData;
2626
delete &isProcessing;
2727
delete &cameraLight;
28-
delete &pretreatmentThread;
28+
delete &prepareThread;
2929
}
3030

31-
void *pretreatmentMethod(void *arg) {
31+
void *prepareMethod(void *arg) {
3232
auto scheduler = static_cast<ImageScheduler *>(arg);
33-
scheduler->readyMat();
33+
scheduler->start();
3434
return nullptr;
3535
}
3636

37+
void ImageScheduler::prepare() {
38+
pthread_create(&prepareThread, nullptr, prepareMethod, this);
39+
}
40+
41+
void ImageScheduler::start() {
42+
stopProcessing = false;
43+
44+
while (true) {
45+
if (stopProcessing) {
46+
break;
47+
}
48+
if (isProcessing) {
49+
continue;
50+
}
51+
preTreatMat();
52+
}
53+
}
54+
55+
void ImageScheduler::stop() {
56+
stopProcessing = true;
57+
}
58+
3759
void
3860
ImageScheduler::process(jbyte *bytes, int left, int top, int cropWidth, int cropHeight,
3961
int rowWidth,
4062
int rowHeight) {
4163
if (isProcessing) {
4264
return;
4365
}
44-
isProcessing = true;
45-
46-
// LOGE("process begin...");
4766

4867
frameData.bytes = bytes;
4968
frameData.left = left;
@@ -60,16 +79,32 @@ ImageScheduler::process(jbyte *bytes, int left, int top, int cropWidth, int crop
6079
frameData.rowWidth = rowWidth;
6180
frameData.rowHeight = rowHeight;
6281

63-
pthread_create(&pretreatmentThread, nullptr, pretreatmentMethod, this);
6482
}
6583

66-
void ImageScheduler::readyMat() {
84+
/**
85+
* 预处理二进制数据
86+
*/
87+
void ImageScheduler::preTreatMat() {
88+
if (isProcessing) {
89+
return;
90+
}
91+
isProcessing = true;
92+
93+
if (frameData.bytes == nullptr) {
94+
isProcessing = false;
95+
return;
96+
}
97+
6798
// 分析亮度,如果亮度过低,不进行处理
99+
LOGE("111111111111111");
68100
analysisBrightness(frameData);
101+
LOGE("222222222222222");
102+
69103
if (cameraLight < 150) {
70104
isProcessing = false;
71105
return;
72106
}
107+
LOGE("33333333333333333");
73108

74109
Mat src(frameData.rowHeight + frameData.rowHeight / 2,
75110
frameData.rowWidth, CV_8UC1,
@@ -84,11 +119,11 @@ void ImageScheduler::readyMat() {
84119
Mat gray;
85120
cvtColor(src, gray, COLOR_RGBA2GRAY);
86121

87-
// LOGE("start decode...");
122+
LOGE("start decode...");
88123
decodeGrayPixels(gray);
89124
}
90125

91-
void ImageScheduler::decodeGrayPixels(const Mat& gray) {
126+
void ImageScheduler::decodeGrayPixels(const Mat &gray) {
92127
Mat mat;
93128
rotate(gray, mat, ROTATE_90_CLOCKWISE);
94129

@@ -128,7 +163,7 @@ void ImageScheduler::decodeGrayPixels(const Mat& gray) {
128163
}
129164
}
130165

131-
void ImageScheduler::decodeThresholdPixels(const Mat& gray) {
166+
void ImageScheduler::decodeThresholdPixels(const Mat &gray) {
132167
Mat mat;
133168
rotate(gray, mat, ROTATE_180);
134169

@@ -148,7 +183,7 @@ void ImageScheduler::decodeThresholdPixels(const Mat& gray) {
148183
}
149184
}
150185

151-
void ImageScheduler::decodeAdaptivePixels(const Mat& gray) {
186+
void ImageScheduler::decodeAdaptivePixels(const Mat &gray) {
152187
Mat mat;
153188
rotate(gray, mat, ROTATE_90_COUNTERCLOCKWISE);
154189

@@ -168,7 +203,7 @@ void ImageScheduler::decodeAdaptivePixels(const Mat& gray) {
168203
}
169204
}
170205

171-
void ImageScheduler::recognizerQrCode(const Mat& mat) {
206+
void ImageScheduler::recognizerQrCode(const Mat &mat) {
172207
cv::Rect rect;
173208
qrCodeRecognizer->processData(mat, &rect);
174209
if (rect.empty()) {
@@ -271,3 +306,4 @@ Result ImageScheduler::readBitmap(jobject bitmap, int left, int top, int width,
271306
}
272307
return reader->read(*binImage);
273308
}
309+

czxing/src/main/cpp/ImageScheduler.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,13 @@ class ImageScheduler {
3737
process(jbyte *bytes, int left, int top, int width, int height, int rowWidth,
3838
int rowHeight);
3939

40-
void readyMat();
40+
void prepare();
41+
42+
void start();
43+
44+
void stop();
45+
46+
void preTreatMat();
4147

4248
void decodeGrayPixels(const Mat& gray);
4349

@@ -54,10 +60,11 @@ class ImageScheduler {
5460
MultiFormatReader *reader;
5561
JavaCallHelper *javaCallHelper;
5662
bool isProcessing = false;
63+
bool stopProcessing = false;
5764
long cameraLight{};
5865
QRCodeRecognizer *qrCodeRecognizer;
5966

60-
pthread_t pretreatmentThread{};
67+
pthread_t prepareThread{};
6168

6269
Result decodePixels(Mat mat);
6370

czxing/src/main/cpp/native-lib.cpp

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,9 @@ Java_me_devilsen_czxing_code_NativeSdk_destroyInstance(JNIEnv *env, jobject inst
7171
jlong objPtr) {
7272

7373
try {
74-
delete reinterpret_cast<ImageScheduler *>(objPtr);
74+
auto imageScheduler = reinterpret_cast<ImageScheduler *>(objPtr);
75+
imageScheduler->stop();
76+
delete imageScheduler;
7577
DELETE(javaCallHelper);
7678
}
7779
catch (const std::exception &e) {
@@ -81,6 +83,35 @@ Java_me_devilsen_czxing_code_NativeSdk_destroyInstance(JNIEnv *env, jobject inst
8183
ThrowJavaException(env, "Unknown exception");
8284
}
8385
}
86+
extern "C"
87+
JNIEXPORT void JNICALL
88+
Java_me_devilsen_czxing_code_NativeSdk_prepareRead(JNIEnv *env, jobject thiz, jlong objPtr) {
89+
auto imageScheduler = reinterpret_cast<ImageScheduler *>(objPtr);
90+
imageScheduler->prepare();
91+
}
92+
93+
extern "C"
94+
JNIEXPORT void JNICALL
95+
Java_me_devilsen_czxing_code_NativeSdk_stopRead(JNIEnv *env, jobject thiz, jlong objPtr) {
96+
auto imageScheduler = reinterpret_cast<ImageScheduler *>(objPtr);
97+
imageScheduler->stop();
98+
}
99+
100+
extern "C"
101+
JNIEXPORT jint JNICALL
102+
Java_me_devilsen_czxing_code_NativeSdk_readBarcodeByte(JNIEnv *env, jobject instance, jlong objPtr,
103+
jbyteArray bytes_, jint left, jint top,
104+
jint cropWidth, jint cropHeight,
105+
jint rowWidth, jint rowHeight) {
106+
jbyte *bytes = env->GetByteArrayElements(bytes_, NULL);
107+
108+
auto imageScheduler = reinterpret_cast<ImageScheduler *>(objPtr);
109+
imageScheduler->process(bytes, left, top, cropWidth, cropHeight, rowWidth, rowHeight);
110+
111+
env->ReleaseByteArrayElements(bytes_, bytes, 0);
112+
return -1;
113+
}
114+
84115
extern "C"
85116
JNIEXPORT jint JNICALL
86117
Java_me_devilsen_czxing_code_NativeSdk_readBarcode(JNIEnv *env, jobject instance, jlong objPtr,
@@ -105,21 +136,6 @@ Java_me_devilsen_czxing_code_NativeSdk_readBarcode(JNIEnv *env, jobject instance
105136
return -1;
106137
}
107138

108-
extern "C"
109-
JNIEXPORT jint JNICALL
110-
Java_me_devilsen_czxing_code_NativeSdk_readBarcodeByte(JNIEnv *env, jobject instance, jlong objPtr,
111-
jbyteArray bytes_, jint left, jint top,
112-
jint cropWidth, jint cropHeight,
113-
jint rowWidth, jint rowHeight) {
114-
jbyte *bytes = env->GetByteArrayElements(bytes_, NULL);
115-
116-
auto imageScheduler = reinterpret_cast<ImageScheduler *>(objPtr);
117-
imageScheduler->process(bytes, left, top, cropWidth, cropHeight, rowWidth, rowHeight);
118-
119-
env->ReleaseByteArrayElements(bytes_, bytes, 0);
120-
return -1;
121-
}
122-
123139
extern "C"
124140
JNIEXPORT jint JNICALL
125141
Java_me_devilsen_czxing_code_NativeSdk_writeCode(JNIEnv *env, jobject instance, jstring content_,

czxing/src/main/java/me/devilsen/czxing/code/BarcodeReader.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,14 @@ public CodeResult read(byte[] data, int cropLeft, int cropTop, int cropWidth, in
6161
return null;
6262
}
6363

64+
public void prepareRead(){
65+
NativeSdk.getInstance().prepareRead(_nativePtr);
66+
}
67+
68+
public void stopRead(){
69+
NativeSdk.getInstance().stopRead(_nativePtr);
70+
}
71+
6472
@Override
6573
protected void finalize() throws Throwable {
6674
try {

czxing/src/main/java/me/devilsen/czxing/code/NativeSdk.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@ public void onBrightnessCallback(boolean isDark) {
6060

6161
native int readBarcodeByte(long objPtr, byte[] bytes, int left, int top, int width, int height, int rowWidth, int rowHeight);
6262

63+
native void prepareRead(long objPtr);
64+
65+
native void stopRead(long objPtr);
66+
6367
// write
6468
native int writeCode(String content, int width, int height, int color, String format, Object[] result);
6569

czxing/src/main/java/me/devilsen/czxing/view/ScanView.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,14 @@ public void onPreviewFrame(byte[] data, int left, int top, int width, int height
7878
@Override
7979
public void startScan() {
8080
super.startScan();
81+
reader.prepareRead();
8182
isStop = false;
8283
}
8384

8485
@Override
8586
public void stopScan() {
8687
super.stopScan();
88+
reader.stopRead();
8789
isStop = true;
8890
}
8991

@@ -96,6 +98,7 @@ public void onReadCodeResult(CodeResult result) {
9698

9799
if (!TextUtils.isEmpty(result.getText()) && !isStop) {
98100
isStop = true;
101+
reader.stopRead();
99102
if (mScanListener != null) {
100103
mScanListener.onScanSuccess(result.getText());
101104
}

0 commit comments

Comments
 (0)