Gomobile에서 Android까지 다중 스레드를 시도해 봅니다.

이번에는 Goomobile+unity에서 Goroutine을 실현할 수 있을지 시험해보는 편이다.
결과적으로 JAR이 고모바일로 만든 AAR을 통해 작동을 확인할 수 있었지만, 쉐이드리브라리를 직접 이동할 수는 없었다.

cgo에 적힌 Shared Library를 Unity에서 직접 호출할 수 없습니까?


아무래도 이번에string으로 돌아오는 값을 시험해 본 것 같아.
String을 설치할 때 Unity와 cgo는 값을 조정해야 합니다.
C.Cstring에서 랩과 C.free에서 해방을 잊어서는 안 된다.
그러나 프로그램은 이루어졌지만 라인을 실행할 때 다운되어 끝난다.
명령하다
GOMOBILE=$GOPATH/pkg/gomobile \
GOOS=android \
GOARCH=arm \
NDK=ndk-r12b \
CC=$GOMOBILE/android-${NDK}/arm/bin/arm-linux-androideabi-clang \
CXX=$GOMOBILE/android-${NDK}/arm/bin/arm-linux-androideabi-clang++ \
CGO_CFLAGS="-target armv7a-none-linux-androideabi --sysroot $GOMOBILE/android-${NDK}/arm/sysroot" \
CGO_CPPFLAGS="-target armv7a-none-linux-androideabi --sysroot $GOMOBILE/android-${NDK}/arm/sysroot" \
CGO_LDFLAGS="-target armv7a-none-linux-androideabi --sysroot $GOMOBILE/android-${NDK}/arm/sysroot" \
CGO_ENABLED=1 GOARM=7 go build -pkgdir=$GOMOBILE/pkg_android_arm \
-tags="" -x -buildmode=c-shared \
-o=./hoge/libhoge.so \
hoge.go
cgo에서 나는'go'의 문법과 매우 크게 다르다고 생각하기 때문에 이런 문법으로 이 점을 실현해야 하는가 말아야 하는가
hoge.ho
package main

import (
  "fmt"
)

// #include <stdlib.h>
import "C"
import "unsafe"

//export MyFunction
func MyFunction() *C.char {

    co := make(chan string)
    hello(co)

    msg := fmt.Sprintln(<-co, "World")
    msg += fmt.Sprintln("Hello", <-co)
    msg += fmt.Sprintln(<-co)

    p := C.CString(msg)
    defer C.free(unsafe.Pointer(p))
    return p
}

func hello(yield chan<- string) {
    go func() {
        yield <- "Hello"
        yield <- "Gopher"
        yield <- "Hello NDS"
    }()
}

func main() {
}
ButtonTest.cs
using UnityEngine;
using System.Runtime.InteropServices;

public class ButtonTest : MonoBehaviour {

    string msg;

    [DllImport("hoge")]
    private static extern string MyFunction();

    public void TestClick()
    {
        string str = MyFunction();
        Debug.Log(str);
        msg = str;
    }

    void OnGUI(){
        GUI.Label (new Rect (0, 0, 300, 300), msg );
    }
}
무슨 예법이 있습니까?좀 더 공부할게요.
앞으로를 기대하다.

Gomobile 표준 bind로 제작된 AAR을 분리하여 Unity 모바일 Shared Library만 사용


스트링의 반환 값이 C.Cstring에서 구현되지 않아 이동하지 않기 때문에 통과합니다.

Gomobileで作成したAARをJAR経由で実行する


이 방법은 Goroutine을 움직이게 했다.
JAR 경유라고 쓰여 있지만 AAA 내부에는 클라우스가 있다.jar가 호출하고 있습니다. (귀찮음)

AAR(Classes.jar->libgojni.so) 순서로 호출합니다.
hoge.go
package hoge 

import (
    "fmt"
)

func MyFunction() string {

    co := make(chan string)
    hello(co)

    msg := fmt.Sprintln(<-co, "World")
    msg += fmt.Sprintln("Hello", <-co)
    msg += fmt.Sprintln(<-co)
    return msg
}

func hello(yield chan<- string) {
    go func() {
        yield <- "Hello"
        yield <- "Gopher"
        yield <- "Hello NDS"
    }()
}
Gomobile 표준 bind 명령 출력hoge.aar
$ gomobile bind -target=android .
Android Studio의 Android Library libs에서 hogear를 설정합니다.

HogeClass.java
package com.example.manabu.hogedroid;
import go.hoge.Hoge;

public class HogeClass {
    public static String get(){
        return Hoge.myFunction();
    }
}
ButtonTest.cs

using UnityEngine;
using System.Collections;

public class ButtonTest : MonoBehaviour
{

    string msg = "";

    public void TestClick(){
        #if UNITY_ANDROID

        using (AndroidJavaClass jc = new AndroidJavaClass("com.example.manabu.hogedroid.HogeClass"))
        {
            Debug.Log(jc);
            string msg = jc.CallStatic<string>("get");
            Debug.Log(msg);
        }
        #endif
    }

    void OnGUI(){
        GUI.Label (new Rect (0, 0, 100, 30), msg);
    }
}
abstract의 내용은 참고만 제공합니다
hoge.aar
package go.hoge;

import go.Seq;

public abstract class Hoge {
    private Hoge() {
    }

    public static void touch() {
    }

    private static native void _init();

    public static native String myFunction();

    static {
        Seq.touch();
        _init();
    }
}

참고 자료

  • 젤라틴과 평행하는 모드
  • Command cgo
  • 관련 보도

  • Gomobile로 AAA를 만들고 Unity로 돌려봤어요.
  • Gomobile로 제작된 AAR를 뜯어 Unity 모바일 Shared Library만 사용
  • Gomobile에서 Shared library를 출력해 보았습니다.
  • 좋은 웹페이지 즐겨찾기