Как использовать c в react-native?

#c #react-native #java-native-interface #cross-platform

Вопрос:

Я пытаюсь использовать свой код c в react-native. Я также искал и нашел, как использовать сайт ниже https://thebhwgroup.com/blog/react-native-jni

Я написал код вдоль сайта

android/app/src/main/java/com/thebhwgroup/demo

HelloWorldModule.java

 //HelloWorldModule.java
package com.thebhwgroup.demo;

import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;

public class HelloWorldModule extends /*ReactContextBaseJavaModule*/{
    public native String helloWorldJNI();

    static{
        System.loadLibrary("hello_world_jni");
    }

    public HelloWorldModule(ReactApplicationContext reactContext){
        super(reactContext);
    }

    @Override
    public String getName(){    //React-Native에서 Module을 식별하는데 사용하는 문자열 return
        return "HelloWorld";    //JS에서 React.NativeModules.HelloWorld로 참조된다.
    }

    @ReactMethod
    public void helloWorld(Promise promise){    //JAVA에서 JS로 데이터 반환하는 방법 (다른 방법도 있음)
                                                //React-Native 문서에 있음
        try {
            String hello = helloWorldJNI();
            promise.resolve(hello);
        }catch (Exception e){
            promise.reject("ERR", e);
        }
    }
}
 

MyReactPackage.java

 //MyReactPackage.java

//HelloWorldModule.java를 React-Native에 등록하려면 Package를 추가해주어야 하기 때문에 필요한 파일

package com.thebhwgroup.demo;

import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.JavaScriptModule;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class MyReactPackage implements ReactPackage{
//    @Override
//    public List<Class<? extends JavaScriptModule>> createJSModules(){
//        return Collections.emptyList();
//    }

    @Override
    public List<ViewManager> createViewManagers(ReactApplicationContext reactContext){
        return Collections.emptyList();
    }

    @Override
    public List<NativeModule> createNativeModules(ReactApplicationContext reactContext){    //HelloWorldModule에 생성되는 모듈과 함께 등록되는 부분
        List<NativeModule> modules = new ArrayList<>();

        modules.add(new HelloWorldModule(reactContext));

        return modules;
    }
}
 

adroid/app/src/main/java/com/thebhwgroup/

MainApplication.java

   @Override
        protected List<ReactPackage> getPackages() {
            return Arrays.<ReactPackage>asList(
                    new MainReactPackage(),
                    new MyReactPackage()
            );
        }
 

Identifies the Module in React-native through the getName of HelloWorldModule.java and is referenced in JS. It also returns data through the helloWorld method.

I created a file like below to use JNI.
android/app/src/main/jni/

Android.mk

 LOCAL_SRC_FILES := hello_world.c
LOCAL_MODULE := hello_world_jni
 

Application.mk

 APP_ABI = all
 

hello_world.c

 #include<jni.h>

jstring Java_com_thebhwgroup_demo_HelloWorldModule_helloWorldJNI(JNIEnv *env, jobject thiz){
    return (*env)->NewStringUTF(env, "Hello World!");
}
 

Файл C был написан в формате JNI со ссылкой на официальный документ и сайт JNI.

android/app/

сборка.сортировка

 android {
    ndkVersion rootProject.ext.ndkVersion

    compileSdkVersion rootProject.ext.compileSdkVersion

    defaultConfig {
        applicationId "com.thebhwgroup"
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode 1
        versionName "1.0"

        ndk {
            abiFilters "armeabi-v7a", "x86"
            moduleName "hello_world_jni"
            ldLibs "log"
            cFlags "-std=c99"
        }
    }
}
 

Проблема

Я запускаю свой собственный проект react react-native run-android , но это приложение не удалось построить.

Эрро есть. error Failed to install the app. Make sure you have the Android development environment set up: https://reactnative.dev/docs/environment-setup. и android/приложение/сборка.gradle build error in import com.android.build.OutputFile in android/app/build.gradle

Похоже, с моими переменными окружения проблем нет. Что я делаю не так?

Ответ №1:

Вместо этого попробуйте запустить приложение из эмулятора: запустите сервер из React и щелкните значок приложения в эмуляторе Android.

Комментарии:

1. После запуска эмулятора запуск в Android Studio отключен. Это проблема с моими настройками?