Expo 또는 React Native에서 Jar.file을 import 해오는 방법은 무엇입니까?

android

(shonee) #1

expo가 포함 된 가이드를 보았습니다. 내가 만든 파일.

참조 사이트

MainActivity 가이드와 함께 추가했습니다. Java에서 코드를 테스트했습니다.

jar.file : android / app / libs / libgbx.jar

Jar.file을 추가했고 테스트는 MainActivity.java 파일에서 수행되었습니다.

build.gradle (앱) :

dependencies {
  implementation fileTree(include: ['*.jar'], dir: 'libs')
  implementation 'gbrick.libgbx:libgbx:1.0'
}

MainActivity.java :

import co.kr.smcore.gbrick.libgbx.WalletManager;
...
public class MainActivity extends DetachActivity {

  WalletManager walletMgr;
  ...

    walletMgr = new WalletManager(this);

    walletMgr.initRealm();


   WalletInfo wallet = walletMgr.createGBXKeystore("test", "test");


    walletMgr.addWallet(wallet); 

테스트가 성공적으로 디버깅되었습니다.

하지만 App.js 파일에서 이 모듈을 쓰는 방법을 모르겠습니다.

const {WalletManager} = NativeModules;

위의 방법을 시도했지만 읽을 수는 없었습니다.

import를 어떻게 사용할 수 있습니까? 자세히 설명해주십시오.

제가 이해할 수 있는 예시를 첨가해주시면 감사하겠습니다.


(이종은(Jong Lee)) #2

네이티브 모듈을 만들어야 네이티브 코드를 사용할 수 있습니다.
다음 문서를 참고하여 네이티브 모듈을 만드시면 저바스크립트에서 네이티브 모듈의 함수를 호출 할 수 있습니다.


(shonee) #3

이미 이 예제에 따라 양식을 테스트 양식을 만들었지만 적용 되지 않았습니다.

'expo init’를 한 후, 'expo eject’을 입력하고 분리했습니다.

'jar’파일을 사용하여 App.js에 응용 프로그램을 테스트하기 위해 기본 'jar’파일을 만들었습니다.

구현은 간단합니다.

jar 파일의 CreateAJarFile.class :

class CreateAJarFile {
    public static void main(String args[]) {
        System.out.println("We got test");
    }
}

bild.gradle (앱) :

dependencies {
  implementation fileTree(dir: 'libs', include: ['*.jar'])
  implementation files('libs/myJarFile.jar')

Android를 적용한 후에 모듈을 Apps.js에 작성했습니다.

android / app / src / main / java / com / myjarfile

CreateAJarFile.java :

package com.myjarfile;

import android.widget.Toast;

import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;

import java.util.Map;
import java.util.HashMap;

public class CreateAJarFile extends ReactContextBaseJavaModule {

  private static final String DURATION_SHORT_KEY = "SHORT";
  private static final String DURATION_LONG_KEY = "LONG";

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

  @Override
  public String getName() {
    return "CreateAJar";
  }

  @Override
  public Map<String, Object> getConstants() {
    final Map<String, Object> constants = new HashMap<>();
    constants.put(DURATION_SHORT_KEY, Toast.LENGTH_SHORT);
    constants.put(DURATION_LONG_KEY, Toast.LENGTH_LONG);
    return constants;
  }

  @ReactMethod
  public void show() {
    System.out.println("We got test");
  }

}

CreateAJarFilePackage.java :

package com.myjarfile;

import com.facebook.react.ReactPackage;
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 CreateAJarFilePackage implements ReactPackage {

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

    @Override
    public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
        List<NativeModule> modules = new ArrayList<>();

        modules.add(new CreateAJarFile(reactContext));

        return modules;
    }

}

CreateAJar.js :

import { NativeModules } from "react-native";

const { CreateAJar } = NativeModules;

export default CreateAJar;

android / app / src / main / java / host / exp / exponent / MainApplication.java

import com.myjarfile.CreateAJarFilePackage;
...
public List<ReactPackage> getPackages() {
    return Arrays.<ReactPackage>asList(
        // Add your own packages here!
        // TODO: add native modules!

        // Needed for `react-native link`
        // new MainReactPackage()
        new CreateAJarFilePackage());
  }

이런 모듈을 만들어 추가하고 App.js에서 테스트했습니다.

import CreateAJar from "./android/app/src/main/java/com/myjarfile/CreateAJar";

export default class App extends React.Component {
...
this.jarfunc = this.jarfunc.bind(this);
...
jarfunc() {
    CreateAJar.show();
  }
...
return (
<View style={styles.container}>
        <Text>Test</Text>
        <Text>{this.jarfunc}</Text>
      </View>

그러나 모듈과 기능을 모두 읽을 수 없습니다.

내가 만든 모듈을 'App.js’에 어떻게 적용합니까?


(shonee) #4

이것은 코드 문제보다 에뮬레이터 문제에 더 가깝습니다. 물론, 코드에 대한 오류가 있었기 때문에 저는 방심하고있었습니다.

누구나 혼동을 일으킬 수 있습니다 expo에서 흔히 볼수 있는 오류가 발생하기 때문입니다 .

bundle gradle(app) :

complie sdk version: 27
...
target sdk version: 26
...

이 설정에서는 위 코드가 작동합니다 anroid 8.0일 때 .

android 8.0이하 에서 작동하려면 target version 반드시 낮추어야합니다 ex) 25 .

메서드가 관련된 view 경우 오류가 처음 발생할 수 있지만 Reload 정상적으로 작동합니다.

그리고 하나 더 중요한 것은 당신이 사용하는 경우이다 @ReactMethod , @ReactMethod 당신의 반환 유형을 설정 한 경우에만 작동합니다 void일 때 . 당신이 int,String,number,bolean 등을 쓰면 그것은 작동하지 않습니다.

이 코드를 실행하고자 하는 경우, 기능 내부 형을 변경 void로 하거나, @ReactMethod의 설정 조건을 변경하십시오 .