【问题标题】:How to use C code (libqrencode) in an iOS project如何在 iOS 项目中使用 C 代码(libqrencode)
【发布时间】:2011-09-28 18:20:46
【问题描述】:

大约一年前,我开始在 iOS 上进行编码,并且已经掌握了编写 Objective C 的能力,并成功地开发了一些应用程序。下周我将参加我的第一个黑客日,并提出了一个涉及 QR 码的准寻宝想法。我已经设法找到 ObjC 类来处理解码二维码,但一开始就没有编码/生成它们。

我在 git hub 上找到了一些目标 C 框架的链接,但似乎都存在未解决的问题。然后我在这里找到了这个帖子:

Is there any QR Encoding Library in Cocoa?

这为我指明了 libqrencode 一个 C“库”的方向,我应该能够在作为 C 超集的 iOS 中工作。

不幸的是,我没有正式的计算机科学背景,我不知道从哪里开始在我的项目中使用。谁能解释我需要做的基本步骤,这样我至少可以智能地谷歌。

到目前为止,我已经阅读了有关设置搜索路径和创建静态库的信息,但不知道这是否是正确的路线。

感谢任何帮助 - 尽量保持简单,我的知识以编写基本的 VC 结束。

【问题讨论】:

    标签: iphone objective-c ios static-libraries qr-code


    【解决方案1】:

    Here's a blogpost 来自一个创建了一个包含库和示例代码的工作 XCode 项目的人。示例代码与@conradev 作为答案之一发布的相同。我在 Xcode 4.3 中对此进行了测试,效果很好。

    我尝试将原始库包含在我的一个项目中,但惨遭失败,但后来我将这些库包含在了这个项目中,并且没有任何调整就可以正常工作,所以我很肯定他没有更改 Xcode 项目中的任何设置。只需创建一个新项目,将 qrencode lib 文件从该项目拖入其中,粘贴@conradev 的代码,一切都会按预期工作。

    【讨论】:

      【解决方案2】:

      我会推荐 Objective C QR Encoder,这是一个 Apache 许可的 QR 编码器,用 Objective C 编写。

      【讨论】:

      • 是的,我已经看到,对于在问题下缺乏日本支持感到遗憾。没问题,我猜它只是一个 hack 项目……你知道其他人吗?
      【解决方案3】:

      看看这个 libqrencode xcode project。它只给你一个编译的库,没有使用示例。

      【讨论】:

        【解决方案4】:

        对于任何 C 静态库,您通常必须执行以下操作:

        1. 在 XCode 项目中包含该库,然后转到该项目 选择“构建阶段”选项卡,并在其中打开“链接二进制文件” 带库”部分 - 添加您的编译静态 libqrencode 那里的图书馆。
        2. 转到项目的“构建设置”选项卡并搜索 “header”,然后将路径添加到库保存 header 的位置 “标头搜索路径”中的文件。

        现在您可以在 Objective-C 文件中包含头文件并直接调用到库中。

        一般的 Google 搜索起点是“将 C 库添加到 XCode iPhone 项目”。这不是真正的 CS 技能,CS 比搜索路径更深奥……

        【讨论】:

        • 除了需要为arm架构(armv7/armv7s)编译库以使其在iOS设备上工作。
        • 您可以明确定义您的应用所需的架构,默认为 armv7/armv7s。但是如果你设置“Architectures”的值,你可以说只是 armv7(而不是 ARCHS_STANDARD_32BIT),那么它就不需要库来支持 armv7s。
        【解决方案5】:

        libqrencode 在 LGPL 下获得许可。为了您的代码仍然是专有的,它必须以允许用户将库替换为修改版本(1) 的方式链接到 libqrencode。这在 App Store 是不可能做到的。您的代码必须获得 GPL 许可才能使用 libqrencode,并且 App Store (2) 不允许使用 GPL 许可的代码。因此,您不能在 App Store 应用程序中使用 libqrencode。

        也就是说,这里有一些代码可以在 iOS 项目中用于与 libqrencode 交互:

        #import <libqrencode/qrencode.h>
        
        void freeRawData(void *info, const void *data, size_t size) {
            free((unsigned char *)data);
        }
        
        - (UIImage *)quickResponseImageForString:(NSString *)dataString withDimension:(int)imageWidth {
        
            QRcode *resultCode = QRcode_encodeString([dataString UTF8String], 0, QR_ECLEVEL_L, QR_MODE_8, 1);
        
            unsigned char *pixels = (*resultCode).data;
            int width = (*resultCode).width;
            int len = width * width;
        
            if (imageWidth < width)
                imageWidth = width;
        
            // Set bit-fiddling variables
            int bytesPerPixel = 4;
            int bitsPerPixel = 8 * bytesPerPixel;
            int bytesPerLine = bytesPerPixel * imageWidth;
            int rawDataSize = bytesPerLine * imageWidth;
        
            int pixelPerDot = imageWidth / width;
            int offset = (int)((imageWidth - pixelPerDot * width) / 2);
        
            // Allocate raw image buffer
            unsigned char *rawData = (unsigned char*)malloc(rawDataSize);
            memset(rawData, 0xFF, rawDataSize);
        
            // Fill raw image buffer with image data from QR code matrix
            int i;
            for (i = 0; i < len; i++) {
                char intensity = (pixels[i] & 1) ? 0 : 0xFF;
        
                int y = i / width;
                int x = i - (y * width);
        
                int startX = pixelPerDot * x * bytesPerPixel + (bytesPerPixel * offset);
                int startY = pixelPerDot * y + offset;
                int endX = startX + pixelPerDot * bytesPerPixel;
                int endY = startY + pixelPerDot;
        
                int my;
                for (my = startY; my < endY; my++) {
                    int mx;
                    for (mx = startX; mx < endX; mx += bytesPerPixel) {
                        rawData[bytesPerLine * my + mx    ] = intensity;    //red
                        rawData[bytesPerLine * my + mx + 1] = intensity;    //green
                        rawData[bytesPerLine * my + mx + 2] = intensity;    //blue
                        rawData[bytesPerLine * my + mx + 3] = 255;          //alpha
                    }
                }
            }
        
            CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, rawData, rawDataSize, (CGDataProviderReleaseDataCallback)&freeRawData);
            CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
            CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
            CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;
            CGImageRef imageRef = CGImageCreate(imageWidth, imageWidth, 8, bitsPerPixel, bytesPerLine, colorSpaceRef, bitmapInfo, provider, NULL, NO, renderingIntent);
        
            UIImage *quickResponseImage = [UIImage imageWithCGImage:imageRef];
        
            CGImageRelease(imageRef);
            CGColorSpaceRelease(colorSpaceRef);
            CGDataProviderRelease(provider);
            QRcode_free(resultCode);
        
            return quickResponseImage;
        }
        

        【讨论】:

        • 我已经和作者核实过,他确认 libqrencode 可以在 bsd 风格的许可下使用。您可以向他寻求特别许可 - github.com/fukuchi/libqrencode
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多