小编Ada*_*ski的帖子

通过JNI将Java对象传递给C++,然后通过void*传递回Java

我有一个Android应用程序,它同时使用React Native和JNI.C++(通过JUCE库的一个分支)用于生成其中一个视图.

React Native要求从重写的方法返回一个新的视图实例createViewInstance(context).每次更新包含此视图的React Native组件时,似乎都会调用此方法.

这是我的(简化)实现:

protected JuceViewHolder createViewInstance(ThemedReactContext themedReactContext) {
    JuceBridge juceBridge = JuceBridge.getInstance();
    juceViewHolder = new JuceViewHolder(themedReactContext);

    // JNI method: this will trigger JuceBridge.createNewView
    MainActivity.createJuceWindow(juceViewHolder); 

    return juceViewHolder;
Run Code Online (Sandbox Code Playgroud)

}

供参考,createJuceWindow定义为:

JUCE_JNI_CALLBACK (JUCE_ANDROID_ACTIVITY_CLASSNAME, createJuceWindow, jobject, (JNIEnv* env, jclass, jobject view))
{
    JuceView::getInstance().createJuceWindow(view);
}
Run Code Online (Sandbox Code Playgroud)

哪个叫:

void createJuceWindow(jobject view)
{
    viewToAttachTo = GlobalRef(view); // [GlobalRef][1] manages NewGlobalRef
    myComponent = std::unique_ptr<MyComponent> (new MyComponent);
    myComponent->setVisible (true);
    myComponent->setOpaque(true);

    if (viewToAttachTo.get() == nullptr)
        DBG ("createJuceWindow: viewToAttachTo null!!!");

    myComponent->setBounds(Desktop::getInstance().getDisplays().getMainDisplay().userArea);
    myComponent->addToDesktop (0, viewToAttachTo.get()); // …
Run Code Online (Sandbox Code Playgroud)

c++ java java-native-interface android react-native

6
推荐指数
0
解决办法
923
查看次数

当道具更新时,React Native组件不透明度不会更新

我有一个React Native子组件,如果disabledprop被设置为true ,它会将按钮呈现为半透明状态.app最初加载后(一旦获得数据)可能会更新,因此不会是组件的初始状态.

我可以看到,一旦我与按钮交互,它就会改变它的状态,但出于某种原因,之前没有.我可以从日志和onPress行为中看到道具正在更新.我尝试了不同的方法,但似乎没有解决问题.

class TestButton extends React.Component {

  constructor(props) {
    super(props);
  }

  render() {
    const buttonOpacity = (this.props.disabled  ? disabledOpacity : 1.0);
    console.log ("test disabled", this.props.disabled, buttonOpacity);

    return (
      <BubbleText style={{opacity: buttonOpacity}} onPress={
        () => ! this.props.disabled && doSomething() }>
          { this.props.testNumber }
      </BubbleText>
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

javascript jsx react-native mobx

6
推荐指数
1
解决办法
1226
查看次数

"'undefined'不是React Native中Native Module的"对象"

尝试在本机模块中调用方法时出现以下错误:

'undefined' is not an object (evaluating 'ScaleController. updateScaleFromJSON')

我的原生模块Objective-C文件 -

RCTScaleController.h:

#ifndef RCTScaleController_h
#define RCTScaleController_h

#import "RCTBridgeModule.h"

@interface RCTScaleController : NSObject <RCTBridgeModule>
@end

#endif /* RCTScaleController_h */
Run Code Online (Sandbox Code Playgroud)

RCTScaleController.mm:

#import "RCTScaleController.h"
#import "ScaleControllerObjC.h"
#import "RCTLog.h"

@implementation RCTScaleController

RCT_EXPORT_MODULE();

RCT_EXPORT_METHOD(updateScaleFromJSON:(NSString *)jsonString)
{
    RCTLogInfo(@"About to send json: %@", jsonString);
    ScaleControllerObjC *scaleController = [[ScaleControllerObjC alloc] init];
    [scaleController updateScaleFromJSON:jsonString];
}
Run Code Online (Sandbox Code Playgroud)

在我的JS文件中需要它:

var ScaleController = require('react-native').NativeModules.RCTScaleController;
Run Code Online (Sandbox Code Playgroud)

在这里它被调用导致错误:

ScaleController.updateScaleFromJSON (JSON.stringify (scale));
Run Code Online (Sandbox Code Playgroud)

我按照我见过的例子,不知道这里有什么问题.

objective-c ios react-native

5
推荐指数
1
解决办法
7577
查看次数

等效于RCTViewManager中的viewDidAppear

我已经为react-native应用程序创建了一个自定义视图,该应用程序本身就是C ++ DSP应用程序,并在计时器上运行。该视图是使用其init方法在启动时初始化的。但是,为了节省CPU周期,我需要知道该视图何时可见。

如果我使用的是iOS UIViewController,则可以使用viewDidAppearviewWillAppear将消息发送到C ++代码以启动计时器,并viewDidDisappear告诉其停止。

我正在寻找一种干净的方法来从RCTViewManager中执行相同的操作。

ios react-native

5
推荐指数
0
解决办法
498
查看次数

Xcode 13 依赖目标未构建或未找到

我有一个从 CMake 生成的 Xcode iOS 项目,由几个具有如下依赖关系树的目标组成:

  • 目标A
  • 目标B
  • 目标 C - 取决于 A 和 B
  • 目标 D - 取决于 C

A、B 和 C 生成静态库。D 是可执行应用程序目标。

在构建阶段一切看起来都是正确的。但是,当我构建目标 D 时,由于缺少 A、B 和 C 的静态库,我收到链接器错误。查看每个依赖项的构建产品路径,我可以看到它们尚未在预期位置创建。

我可以进入每个目标并在 Xcode 中构建它,之后我会看到“构建成功”消息,但遗憾的是,目标的“构建产品路径”中没有出现任何内容。

实现此目的的唯一方法是xcodebuild在每个目标的命令行上运行。这并不理想,因为这意味着我无法将代码库作为一个项目来工作 - 我必须手动构建修改后的目标才能在可执行文件中对其进行测试。奇怪的是我在 Xcode 中遇到了目标的构建错误,所以有些东西正在编译,但我不知道在哪里!

我使用的是 macOS 12.0.1 和 Xcode 13.2.1

请注意,直接通过 CLion 为 macOS 构建相同的 CMake 项目可以正常构建 - 问题似乎与生成的 Xcode 项目有关。

xcode ios macos-monterey

5
推荐指数
0
解决办法
587
查看次数

phpspec和laravel设置

我正在建立一个新的Laravel项目并整合PHPSpec.我无法找到一个与Laravel整齐合作的phpspec.yml文件的良好工作示例.与Rails中的RSpec类似.

我想要的文件夹结构如下

spec/
    models/
    controllers/
app/
    models/
    controllers/
Run Code Online (Sandbox Code Playgroud)

我的phpspec.yml目前看起来像这样:

suites:
controller_suite:
    namespace: Controller
    spec_path: 'spec/controllers'
    src_path: 'app/controllers'

model_suite:
    namespace: Model
    spec_path: 'spec/models'
    src_path: 'app/models'  
Run Code Online (Sandbox Code Playgroud)

我在spec/models文件夹中复制了我的模型相关测试,但是当我'phpspec运行'它没有运行它们中的任何一个.我也意识到命名空间不是Laravel中的'Model'和'Controller',也许更像是Eloquent和BaseController.

我也使用这个扩展名:https://github.com/BenConstable/phpspec-laravel

我不知道如何设置它,找不到任何有用的例子.提前致谢!

编辑:来自Jeffrey Way的另一个论坛上的建议:

您可以使用Behat测试您的控制器.PHPSpec不能代替它(或Codeception).

更新:

我已经决定使用Codeception,因为它似乎整齐地集成到Laravel并广泛使用.

phpspec laravel

4
推荐指数
1
解决办法
2820
查看次数

使用React Native的CocoaPod:`ld:找不到-lReact`的库

我正在将React Native与现有的iOS应用程序集成.我已经按照指南集成了现有的应用程序.

在阅读了关于这个主题的其他一些帖子后,我尝试过:

  • 在Pod构建中设置体系结构以匹配Xcode中的项目设置
  • 在Scheme中的项目构建之上添加/移动Pod构建

还有什么我可能需要检查的吗?

xcode ios cocoapods react-native

4
推荐指数
1
解决办法
1万
查看次数

Javascript/本机代码不同步(参数数量不同)错误

我最近从 1.24 更新到了ReactNativeControllers 2.03。我还把 RN 更新到了 0.25。我使用的fork只添加了 Podspec 文件。在整理完 RN 中的所有导入更改后,我现在对这个错误感到困惑:

(另请参阅https://github.com/wix/react-native-controllers/issues/59

RCCManager.setRootController 被调用时使用了 3 个参数,但期望有 2 个参数。如果您自己没有更改此方法,这通常意味着您的本机代码和 JavaScript 代码的版本不同步。更新两者应该可以消除此错误。

有问题的代码:

RCCManagerModule.m

setRootController:(NSDictionary*)layout animationType:(NSString*)animationType globalProps:(NSDictionary*)globalProps)
Run Code Online (Sandbox Code Playgroud)

并在index.js

ControllerRegistry: {
    registerController: function (appKey, getControllerFunc) {
      _controllerRegistry[appKey] = getControllerFunc();
    },
    setRootController: function (appKey, animationType = 'none', passProps = {}) {
      var controller = _controllerRegistry[appKey];
      if (controller === undefined) return;
      var layout = controller.render();
      _validateDrawerProps(layout);
      RCCManager.setRootController(layout, animationType, passProps);
    }
  },
Run Code Online (Sandbox Code Playgroud)

很明显,两者都有 3 个参数。

我已经杀死并重新启动了打包程序。我已经清理了 Xcode …

ios cocoapods react-native react-native-navigation

4
推荐指数
1
解决办法
5932
查看次数

LinearLayout中的DrawerLayout内的RecyclerView不可滚动/可点击

我调整了布局,以便导航抽屉出现在工具栏下方:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.Toolbar android:id="@+id/detail_toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        app:layout_collapseMode="pin"
        app:layout_scrollFlags="scroll|enterAlways"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />


    <android.support.v4.widget.DrawerLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true">



        <android.support.v7.widget.RecyclerView
            android:id="@+id/left_drawer"
            android:scrollbars="vertical"
            android:layout_width="240dp"
            android:layout_height="match_parent"
            android:layout_gravity="left|start"
            android:choiceMode="singleChoice"
            android:divider="@null"
            android:background="@color/colorPrimary"
            />

        <android.support.design.widget.CoordinatorLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
            android:layout_height="match_parent" android:fitsSystemWindows="true"
            tools:context=".JuceActivity" tools:ignore="MergeRootFrame">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:id="@+id/juce_view_container"
                app:layout_behavior="@string/appbar_scrolling_view_behavior"
                android:orientation="horizontal" />

            <android.support.design.widget.FloatingActionButton android:id="@+id/fab"
                android:layout_width="wrap_content" android:layout_height="wrap_content"
                android:layout_gravity="center_vertical|start" android:layout_margin="@dimen/fab_margin"
                android:src="@android:drawable/stat_notify_chat"
                app:layout_anchor="@+id/juce_view_container" app:layout_anchorGravity="top|end" />

        </android.support.design.widget.CoordinatorLayout>
    </android.support.v4.widget.DrawerLayout>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

但是,现在抽屉的Recycler View不会滚动,也不会响应点击事件.

我在这里错过了什么?

android android-layout

3
推荐指数
1
解决办法
1619
查看次数

如何在 MobX 中将装饰器 @action 转换为非装饰器操作

我正在从我的 React Native 应用程序中删除装饰器(babel 的问题太多)并且我的操作不起作用(包含的函数没有运行)。

我正在翻译集体诉讼,例如

class MyStore {
  //...

  @action 
  myAction(param) {
    //...
  }
}
Run Code Online (Sandbox Code Playgroud)

class MyStore {
  //...

  myAction(param) {
    action("Perform action with param", (param) => {
      //...
    })
  }
}
Run Code Online (Sandbox Code Playgroud)

将类@action 转换为非装饰器形式的正确方法是什么?

javascript reactjs react-native mobx mobx-react

3
推荐指数
1
解决办法
1373
查看次数

Laravel-Request :: server('HTTP_HOST')从帮助器类中返回'localhost'

我想使用Request :: server('HTTP_HOST')来获取当前域-但是,当我从一个帮助器类中调用它时,它返回为'localhost',这不是我想要的。从控制器可以正常工作。有没有办法从帮助程序类中访问此信息?

助手类如下所示:

class ApiWrapper {
    public static function call($model, $method='', array $input) {



        $domain = Request::server('HTTP_HOST');
    }
}
Run Code Online (Sandbox Code Playgroud)

session http-post-vars laravel-4

1
推荐指数
1
解决办法
1万
查看次数