Gomobile에서 Android까지 다중 스레드를 시도해 봅니다.
결과적으로 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.csusing 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();
}
}
참고 자료
관련 보도
Reference
이 문제에 관하여(Gomobile에서 Android까지 다중 스레드를 시도해 봅니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/mbotsu/items/95187a08a52829c95ad4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)