gpt4 book ai didi

ios - 注册 Darwin 通知并通过回调发送事件详细信息 - 代号一

转载 作者:行者123 更新时间:2023-12-02 01:45:27 24 4
gpt4 key购买 nike

我正在尝试创建一个代号为 One 的测试应用程序,该应用程序通过 Darwin 通知监听 displayStatus 更改,并通过回调将事件发送到 Java 端。我对 C 的了解非常少,而且对 Objective C 几乎一无所知,所以我那部分的大部分代码都是从网络上的几个地方提取和加入的。我已遵循开发人员指南,但在云上构建失败。到目前为止我已经做了以下工作:

在我的启动方法中,我有这个:

public void start() {
if(current != null){
current.show();
return;
}
Form hi = new Form("Xerveur", new LayeredLayout());

hi.add(buildRootContainer()).add(buildRootChildContainer());

Display.getInstance().callSerially(hi::show);
registerForNativeCallback();
}

这注册了 native 接口(interface):

private void registerForNativeCallback(){
NativeListener listener = NativeLookup.create(NativeListener.class);
if( listener != null && listener.isSupported() ){
Log.p("Setup Event Listener returned: " + listener.setupEventListener());
}
}

以上代码片段位于主类文件中。 NativeListener接口(interface)很简单:

public interface NativeListener extends NativeInterface {
public boolean setupEventListener();
}

现在我有一个简单的回调类,它应该接收一个字符串,并具有来自 native 端的所需信息:

public class NativeCallback {
public static void receive(String payload){
Log.p(payload);
}
}

这些是生成的“.m”文件的内容(“.h”文件未对自动生成的内容进行修改)并且我进行了编辑:

#import "ca_ratelsoft_testing_testapp2_NativeListenerImpl.h"
#include "ca_ratelsoft_testing_testapp2_NativeCallback.h"
#include "CodenameOne_GLViewController.h"
#include <unistd.h> // good idea in general
#include <stdlib.h> // good idea in general

#include <CoreFoundation/CoreFoundation.h>
#include <notify.h> // for all notifications


@implementation ca_ratelsoft_testing_testapp2_NativeListenerImpl

-(BOOL)setupEventListener{
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), //center
NULL, // observer
displayStatusChanged, // callback
CFSTR("com.apple.springboard.displayStatus"), // event name
NULL, // object
CFNotificationSuspensionBehaviorDeliverImmediately);

return YES;
}

static void displayStatusChanged(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) {
NSLog(@"event received!");
// you might try inspecting the `userInfo` dictionary, to see
// if it contains any useful info
if (userInfo != nil) {
const void * keys;
const void * values;
NSString *payload = @"displayStatus$$$"; //delimeter: $$$
CFDictionaryGetKeysAndValues(userInfo, &keys, &values);

//key1=value1;key2=value2;

for (int i = 0; i < CFDictionaryGetCount(userInfo); i++) {
const char * keyStr = CFStringGetCStringPtr((CFStringRef)&keys[i], CFStringGetSystemEncoding());
const char * valStr = CFStringGetCStringPtr((CFStringRef)&values[i], CFStringGetSystemEncoding());
if( i > 0 )
payload = [payload stringByAppendingString:@";"];
payload = [payload stringByAppendingString:@(keyStr)];
payload = [payload stringByAppendingString:@"="];
payload = [payload stringByAppendingString:@(valStr)];
}

ca_ratelsoft_testing_testapp2_NativeCallback_receive___java_lang_String(CN1_THREAD_GET_STATE_PASS_ARG fromNSString(CN1_THREAD_GET_STATE_PASS_ARG payload));
}
}

-(BOOL)isSupported{
return YES;
}

@end

构建调试 iOS 应用程序时出现以下错误:https://www.dropbox.com/s/sq8f00nzf445gp0/f9e35511-c43f-4bb6-854a-f513ec8e3820-1500397464685-error.txt?dl=0

最佳答案

首先让我们从错误开始,如果滚动到底部,您将看到提及 NativeListenerImpl.o 。如果您在文件中搜索 NativeListenerImpl,您将看到该文件的编译代码以及其正下方的实际错误:

src/ca_ratelsoft_testing_testapp2_NativeListenerImpl.m:2:10: fatal error: 'ca_ratelsoft_testing_testapp2_NativeCallback.h' file not found
#include "ca_ratelsoft_testing_testapp2_NativeCallback.h"
^
1 error generated.

发生这种情况是因为我们的优化器过于渴望删除未使用的代码并且找不到回调的用法。您可以通过将以下代码添加到主类来解决此问题:

boolean fakeVariable;

public void init(Object o) {
// ... rest of code

if(fakeVariable) {
NativeCallback.receive(null);
}
}

这很重要。不要将变量设为私有(private)!!!

该变量受包保护,并且始终为 false,因此代码永远不会发生。理论上,某些代码可以更改该标志,因此优化器无法检测到这一点,并且将被迫保留该代码。

关于ios - 注册 Darwin 通知并通过回调发送事件详细信息 - 代号一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45174201/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com