真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網站制作重慶分公司

go開發(fā)java代碼生成 golang 生成代碼

GO語言中看到這樣一串代碼,換成java的話怎么寫??

case QImage::Format_RGB32:

我們提供的服務有:成都網站設計、成都網站建設、微信公眾號開發(fā)、網站優(yōu)化、網站認證、高碑店ssl等。為成百上千企事業(yè)單位解決了網站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的高碑店網站制作公司

case QImage::Format_ARGB32:

case QImage::Format_ARGB32_Premultiplied:

for(int i = 0; i height; i ++)

{

const QRgb *pSrc = (QRgb *)image.constScanLine(i);

uchar *pDest = (uchar *)ret.scanLine(i);

for( int j = 0; j width; j ++)

{

pDest[j] = qGray(pSrc[j]);

}

}

break;

}

return ret;

}

如何Golang開發(fā)Android應用

環(huán)境配置好復雜,我不得不嘮叨幾句。

需要下載golang1.4rc版,下載ndk,然后編譯。 然后用go get 下載gobind這個工具, 然后,將寫好的代碼用gobind轉化下,然后使用特殊的編譯命令,將代碼編譯成.so文件,將生成的相關文件,放到android studio的項目中。然后java代碼中,利用jni調用引用的代碼。

... 好,接著往下看吧。

環(huán)境準備

一臺Linux 64的機器

一個帶有AndroidStudioIDE的開發(fā)機器

因為環(huán)境配置實在復雜,所以我們引入的docker。

docker pull codeskyblue/docker-goandroid

docker run --rm -ti codeskyblue/docker-goandroid bash

cd example; echo "view example projects

docker起來之后,什么就都配置好了,NDK啦,java啦,GO的環(huán)境變量了,等等,并且還預裝了vim,gradle,tmux,git,syncthing,svn

開始寫代碼

寫代碼之前,先約定下目錄結構

go的代碼都放在src/golib下,編譯使用make.bash編譯腳本,看下這個文件樹

.

|-- app.iml

|-- build.gradle

|-- libs/armeabi-v7a # go編譯生成的so文件

| `-- libgojni.so

|-- main.go_tmpl # 一個模板文件,先不用管它

|-- make.bash # 編譯腳本,用來生成.so和Java代碼

`-- src

|-- golib

| |-- hi

| | |-- go_hi?0?2?0?2?0?2 # 自動生成的代碼

| | | `-- go_hi.go

| | `-- hi.go # 需要編寫的代碼

| `-- main.go

`-- main

|-- AndroidManifest.xml

|-- java

| |-- go # 自動生成的代碼

| | |-- Go.java

| | |-- Seq.java

| | `-- hi

| | `-- Hi.java

| `-- me/shengxiang/gohello # 主要的邏輯代碼

| `-- MainActivity.java

`-- res

我已經寫了一個例子,先直接搞下來

編譯下,試試行不行(就算不行問題應該也不大,因為大問題都被我消滅了)

cd GoHello/app

./make.bash

../gradlew build

一切順利的話在build/outputs/apk下應該可以看到app-debug.apk這個文件。(劇透下,這個文件只有800多K)

編譯好的我放到qiniu上了,可以點擊下載看看

下面可以嘗試改改,我拋磚引玉說下

打開hi.go這個文件

hi.go的內容,比較簡單,我們寫Go代碼主要就是這部分

// Package hi provides a function for saying hello.

package hi

import "fmt"

func Hello(name string) {

fmt.Printf("Hello, %s!\n", name)

return "(Go)World"

}

文件末尾添加下面這行代碼

func Welcome(name string) string {

return fmt.Sprintf("Welcome %s to the go world", name)

}

使用./make.bash重新編譯下

打開MainActivity.java 修改下OnClickListener事件

button.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

String message = Hi.Welcome("yourname");

Toast.makeText(MainActivity.this, message, Toast.LENGTH_LONG).show();

}

});

編譯運行下,把生成的apk安裝到手機上試試。

原理解讀(有興趣的接著看)

首先說下gobind這個工具。

go_hi/go_hi.go這個文件時通過gobind這個工具生成的,用來配合一個簡單的程序,生成.so文件

// go_hi.go

package go_hi

import (

"golang.org/x/mobile/bind/seq"

"example/hi"

)

func proxy_Hello(out, in *seq.Buffer) {

param_name := in.ReadUTF16()

hi.Hello(param_name)

}

func init() {

seq.Register("hi", 1, proxy_Hello)

}

這個簡單的程序內容是這樣的

// main.go

package main

import (

"golang.org/x/mobile/app"

_ "golang.org/x/mobile/bind/java"

_ "example/hi/go_hi"

)

func main() {

app.Run(app.Callbacks{})

}

src/MyActivity.java文件內容是這樣的

import ...

import go.Go; // 引入Go這個包

import go.hi.Hi; // gobind生成的代碼

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

Go.init(getApplicationContext()); // 初始化兩個線程

Hi.Hello("world");

}

}

其中有一句Go.init(...)這里再看go.Go這個包是什么樣子的

public final class Go {

// init loads libgojni.so and starts the runtime.

public static void init(Context context) {

... 判斷該函數(shù)是否該執(zhí)行的代碼 -- 省略 --

System.loadLibrary("gojni"); // gojni需要這句

new Thread("GoMain") {

public void run() {

Go.run(); // run()是一個native方法

}

}.start();

Go.waitForRun(); // 這個也是一個native方法

// 這部分可以理解為,啟動了一個后臺線程不斷的接收結果到緩存中。

new Thread("GoReceive") {

public void run() { Seq.receive(); }

}.start();

}

private static boolean running = false;

private static native void run();

private static native void waitForRun();

}

MyActivity.java中還有段代碼是 Hi.Hello("world");,打開Hi.java路徑在src/go/hi/Hi.java,這個文件也是gobind生成的,是用來給java方便的調用.so文件

// Hi.java

// File is generated by gobind. Do not edit.

package go.hi;

import go.Seq;

public abstract class Hi {

private Hi() {} // uninstantiable

public static void Hello(String name) {

go.Seq _in = new go.Seq();

go.Seq _out = new go.Seq();

_in.writeUTF16(name);

Seq.send(DESCRIPTOR, CALL_Hello, _in, _out); // 下面接著說

}

private static final int CALL_Hello = 1;

private static final String DESCRIPTOR = "hi";

}

Seq.send這部分實際上最終調用的是一段go代碼

func Send(descriptor string, code int, req *C.uint8_t, reqlen C.size_t, res **C.uint8_t, reslen *C.size_t) {

fn := seq.Registry[descriptor][code]

in := new(seq.Buffer)

if reqlen 0 {

in.Data = (*[maxSliceLen]byte)(unsafe.Pointer(req))[:reqlen]

}

out := new(seq.Buffer)

fn(out, in)

seqToBuf(res, reslen, out)

}

為什么許多原本的 Java 項目都試圖用 go 進行重寫開源?

項目推倒重構是項目開發(fā)大忌,一方面我們要盡量避免做項目推倒重構,盡量在前期就規(guī)劃好,另一方面,我們又希望項目能常做小重構,這對項目可持續(xù)性開發(fā)是很有幫助的。而語言的重構,把Java項目用Go語言重寫一遍,無疑是一次重大的推倒重來。

一、Go語言的優(yōu)勢在哪里

Go語言領先于Java的最大優(yōu)勢,就在于快。Go語言會被編譯成機器代碼,直接執(zhí)行;Java語言則使用JVM運行其代碼,這比Go語言要慢了很多。另外,Java語言的內存管理,相比于Go語言,也復雜得多,而內存管理,不管對于程序運行,還是對程序員的開發(fā),都極為重要。最后,Go語言沒有引用只有指針,這比Java語言處處引用,又領先了一個身位。

二、Go語言為什么更適合開源

開源,也就是開放源代碼,最大的好處在于,可以利用全世界的程序員資源,來幫助你完善你的產品,開發(fā)新需求,或者修復產品BUG。這對產品的可持續(xù)發(fā)展,是非常有幫助的,很多企業(yè)紛紛將自己的產品開源,其實就是這個道理。而Go語言更易學,更易避錯,更易閱讀等特點,就決定了它更適合用來做開源項目。

三、Java語言的優(yōu)勢

Java語言是目前軟件開發(fā)中使用率最廣泛,也是最重要的程序之一,它的地位,絕對不是目前Go語言可以比擬的。Java在WEB應用的開發(fā)中,有著很重要的地位。但是,Java語言相對復雜的并發(fā)設計,相當龐大的項目體系,使其在開發(fā)、測試階段都略為復雜,在某些方面已經逐步落后于其他語言。


標題名稱:go開發(fā)java代碼生成 golang 生成代碼
URL網址:http://weahome.cn/article/hjssgd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部