HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0615
kanamaruhsp3dishの独自改造方法9解決


kanamaru

リンク

2015/6/15(Mon) 18:36:16|NO.69800

androidアプリを作る計画を進めていて、
hspから作ろうと思ったのですが、
windows版とhsp3dish(android)版のhspの違いに困り、
少し前のスレッドにhsp3dishで解像度を取得できるようにするというのがあったので、
hsp3dishに独自の機能を組み込めるのではないかと思い、
ソースを見たのですが、
hsp3dishのシステムにに新たな関数を追加して
hspからその関数を使う方法がわかりませんでした。
どのファイルに関数を追加すれば、hspから使えるようになりますか?
また、どの関数の処理を変えれば、
hsp3dish対応命令の機能を増やせますか?
できたら、javaでできたら資料も多いのでいいのですが、
おそらくC言語で関数を定義する必要が出てくるので、
C言語を用いたandroidAPIの使い方を説明してるサイトも合わせて教えてください。



この記事に返信する


zakki

リンク

2015/6/15(Mon) 21:46:02|NO.69802

やることごとに実際に変更するファイルは変わりますが、とりあえずは既にある命令をgrep(もしくはテキストエディタの全文検索)で追って少し動作を変えてみるのはどうでしょう。
例えばcelputだと

$ git grep celput -- hsp3 hsp3dish/ package/win32/android/hspproj/ package/win32/common/ hspcmp/ hsp3/win32gui/hsp3gr_wingui.cpp: case 0x3e: // celput hsp3dish/emscripten/hgiox.cpp:int hgio_celputmulti( BMSCR *bm, int *xpos, int *ypos, int *cel, int count, BMSCR *bmsrc ) hsp3dish/hgio.h:int hgio_celputmulti( BMSCR *bm, int *xpos, int *ypos, int *cel, int count, BMSCR *bmsrc ); hsp3dish/hsp3gr_dish.cpp: case 0x3e: // celput hsp3dish/hsp3gr_dish.cpp: case 0x5f: // celputm hsp3dish/hsp3gr_dish.cpp: p_res = hgio_celputmulti( (BMSCR *)bmscr, p_ptr1, p_ptr2, p_ptr3, p2, (BMSCR *)bm2 ); hsp3dish/win32/hgiox.cpp:int hgio_celputmulti( BMSCR *bm, int *xpos, int *ypos, int *cel, int count, BMSCR *bmsrc ) hsp3dish/win32gp/hgiox.cpp:int hgio_celputmulti( BMSCR *bm, int *xpos, int *ypos, int *cel, int count, BMSCR *bmsrc ) hspcmp/hspcmd.cpp: "$03e 9 celput", // (ver3.2) hspcmp/hspcmd.cpp: "$05f 9 celputm", // (ver3.5) package/win32/android/hspproj/jni/hsp3/hgio.h:int hgio_celputmulti( BMSCR *bm, int *xpos, int *ypos, int *cel, int count, BMSCR *bmsrc ); package/win32/android/hspproj/jni/hsp3/hsp3gr_dish.cpp: case 0x3e: // celput package/win32/android/hspproj/jni/hsp3/hsp3gr_dish.cpp: case 0x5f: // celputm package/win32/android/hspproj/jni/hsp3/hsp3gr_dish.cpp: p_res = hgio_celputmulti( (BMSCR *)bmscr, p_ptr1, p_ptr2, p_ptr3, p2, (BMSCR *)bm2 ); package/win32/android/hspproj/jni/hsp3/ndk/hgiox.cpp:int hgio_celputmulti( BMSCR *bm, int *xpos, int *ypos, int *cel, int count, BMSCR *bmsrc ) package/win32/android/hspproj/jni/hsp3/ndkgp/hgiox.cpp:int hgio_celputmulti( BMSCR *bm, int *xpos, int *ypos, int *cel, int count, BMSCR *bmsrc )
それぞれのファイルで何をしてるかというと

* hspcmp/hspcmd.cpp もしくは win32/common/〜.as
hspcmpコンパイラに向けてコマンド名とコマンドIDを宣言

* hsp3dish/hsp3gr_dish.cpp の cmdfunc〜
HSPEXINFO構造体経由で命令呼び出し時の実際の処理
コマンドIDごとに処理を切り分けて、スクリプトが渡した引数をスタックから取り出してやりたい処理をやる
celputの場合はパラメータを取り出してBmscrクラスのメソッドを呼ぶ

* hsp3dish/hspwnd_dish.cpp
cmdfuncから呼ばれて実際に各種OSでの描画処理

のような感じです。
Androidが提供しているJavaのメソッドをHSPをから使いたい場合は、HSP→C→Javaの経路をたどることになるんで、Android NDKでJNI呼び出しをする場合のドキュメントを探すと良いかと思います。
NDKの公式のドキュメントなりブログでの解説記事なり



f(帰還中)

リンク

2015/6/15(Mon) 22:08:41|NO.69803

もう、そこまでやるんなら素直にjavaでやれよと思うが。

どうしてもと言うなら止めはしないが。



kanamaru

リンク

2015/6/15(Mon) 23:35:38|NO.69808

どうやらjavaで改造する方が簡単のようですね。
どうやったらjavaの関数をhspから使えるのかがよくわかりません。
jniは調べてあるのですが、理解ができず。
分かりやすく解説しているサイトがありますか?



y.tack

リンク

2015/6/16(Tue) 00:14:59|NO.69809

hspletだとjavaでdll書いてdllとして扱うかんじでした
その方法が通用するなら
dllで実現できることは出来ますな
って改造は辛そうですね
hsp on java っぽくて
僕はdish使ったことないですけど 興味深い試みです



zakki

リンク

2015/6/16(Tue) 00:30:14|NO.69810

> C言語を用いたandroidAPIの使い方を説明してるサイト
NDK公式サンプル https://developer.android.com/ndk/samples/sample_teapot.html
のEngine::UpdateFPSや
OpenHSPでいう package/win32/android/hspproj/jni/javafunc.cpp の jcall_void_str() が
実際Javaを呼んでる箇所です。

> jniは調べてあるのですが、理解ができず。
JNIの解説だとC++についてある程度と、Java/JVMについて深い理解があることを前提としてるところばかりじゃないかと思います。
Javaの低レベルな部分を扱うことになって普通にJavaプログラミングするより面倒な領域なので、どのあたりで詰まっているのかわからないのとなんとも…



kanamaru

リンク

2015/6/16(Tue) 12:41:55|NO.69811

試しに、 jcall_void_strのソースを読んでみました。
もともと、C言語の知識は少しあったので。
ただ、何度考えても引数のnameに何が入るのかがわかりませんでした。
nameには何が入るのでしょうか?
また、ふと思ったのですが、javaで作ったクラスをgcjでコンパイルしたのは
使えないのですか?
使えれば、jniとか考えなくてもいいので。



f(晩飯後)

リンク

2015/6/16(Tue) 18:35:30|NO.69814

>どうやったらjavaの関数をhspから使えるのかがよくわかりません。

いや、ちがくて。

eclipseなりSDKなりDLしてHSPを忘れてそっちでやれと。
…まあ良いか。



zakki

リンク

2015/6/16(Tue) 21:26:36|NO.69815

考えて分かることじゃないので、どこから呼ばれてるのかgrepするのと、nameを使っているenv->GetMethodIDが何なのかJNIのドキュメントを読むのと、printf追加してadbで見るのをやるしか。
https://docs.oracle.com/javase/jp/1.5.0/guide/jni/spec/functions.html#wp16656

gcjは既にgcj熟知してるっていうのでもなければ普通の状況だとあんまり旨味なさそうです。

環境固有の機能をHSP向けに追加する面倒さはだいたいWindows < iOS < Android,WebGL くらいなので
・Windows版dishに命令追加してみる
・普通にJavaでAndroidのハローワールド動かしてみる
・Android NDKのハローワールド動かしてみる
をそれぞれやってからじゃないと把握すること多すぎで混乱すると思います。



kanamaru

リンク

2015/8/16(Sun) 10:56:28|NO.70797

どうやら、今の実力だと改造は不可能という結論になりました。
皆さんの意見を取り入れ、今後勉強していきたいと思います。



ONION software Copyright 1997-2023(c) All rights reserved.