Processingで「java.lang.VerifyError」が表示された時の対処方法
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 3,295
Processingで「java.lang.VerifyError」が表示された時の対処方法が知りたいです。
こんにちは。
Processingで、「画面を右クリックするとポップアップメニューを表示する」プログラムを書いています。
しかし、実行すると以下のエラーメッセージが表示されます。
エラーメッセージ
java.lang.VerifyError: Bad type on operand stack
Exception Details:
Location:
ppopupmenu/PPopupMenu.show()V @19: invokevirtual
Reason:
Type 'processing/core/PApplet' (current frame, stack[1]) is not assignable to 'java/awt/Component'
Current Frame:
bci: @19
flags: { }
locals: { 'ppopupmenu/PPopupMenu' }
stack: { 'ppopupmenu/PPopupMenu', 'processing/core/PApplet', integer, integer }
Bytecode:
0x0000000: 2a2a b400 0d2a b400 0db4 002b 2ab4 000d
0x0000010: b400 30b6 0022 b1
- 今回ポップアップメニュー表示のために、「PPopupMenu」という外部ライブラリを使用しています。そこでエラーが起きているような気がします。
該当のソースコード
- 参考にした本(『ARプログラミング—Processingでつくる拡張現実感のレシピ—』)のサンプルコードをそのまま使用しています。
/* ARマーカを使って重畳表示したCGに対してポップアップメニューを表示 */
import ppopupmenu.*;
import picking.*;
import processing.video.*;
import processing.opengl.*;
import jp.nyatla.nyar4psg.*;
Capture cam = null;
MultiMarker ar = null;
Picker picker = null;
PPopupMenu menu = null;
color box_color = #ffffff;
void setup(){
size(640, 480, P3D);
ar = new MultiMarker(this, width, height, "camera_para.dat", NyAR4PsgConfig.CONFIG_PSG );
ar.addARMarker("patt.hiro", 80);
cam = new Capture(this, 640, 480);
picker = new Picker(this);
menu = new PPopupMenu(this);
menu.addMenuItem("red", "changeBoxColorRed");
menu.addMenuItem("green", "changeBoxColorGreen");
menu.addMenuItem("blue", "changeBoxColorBlue");
menu.addMenuItem("yellow", "changeBoxColorYellow");
menu.addMenuItem("purple", "changeBoxColorPurple");
menu.addMenuItem("cyan", "changeBoxColorCyan");
}
void draw(){
if (cam.available()==false) return;
cam.read(); // カメラ画像の読み込み
background(0); // 画面の初期化
ar.drawBackground(cam); // 背景画像の描画
ar.detect(cam); // マーカ認識
if ( ar.isExistMarker(0) ) {
picker.start(0);
ar.beginTransform(0);
fill(box_color);
translate(0, 0, 20);
box(40);
ar.endTransform();
picker.stop();
}
}
void mouseClicked() {
if (mouseButton==RIGHT){
int id = picker.get(mouseX, mouseY);
if ( id == 0 ) {
if ( !ar.isExistMarker(0) ) return;
menu.show();
}
} else {
box_color = #ffffff;
}
}
void changeBoxColorRed(){
box_color = #ff0000;
}
void changeBoxColorGreen(){
box_color = #00ff00;
}
void changeBoxColorBlue(){
box_color = #0000ff;
}
void changeBoxColorYellow(){
box_color = #ffff00;
}
void changeBoxColorPurple(){
box_color = #ff00ff;
}
void changeBoxColorCyan(){
box_color = #00ffff;
}
試したこと
- 「PPopupMenu」という外部ライブラリを使うと、このコードに限らず他のサンプルコードでも同じエラーが出ることを確認しました。
- 「PPopupMenu」以外のライブラリ使用時は、きちんと動きます。
- Processing3を使っていたのですが、バージョンの問題かもしれないと思い、Processing1.5.1という昔のバージョンを入れて試してみましたが同じエラーが出ました。
- 検索して、javaでこういったエラーが出ることは分かったんですが、他にどう対処したらいいか分かりませんでした。
補足情報(FW/ツールのバージョンなど)
- Processing3を使用しています。
- PC環境は、windows10です。
初めてこちらで質問するので、情報が足りなかったらすみません。
ご回答いただけたら幸いです。よろしくお願いいたします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
実験していないので推測でのコメントです。
PPopupMenuはProcessing2でしか使えずProcessing3では使えないのではないかと思います。
VerifyErrorの原因
以下、PPopupMenuが
https://github.com/hixi-hyi/ppopupmenu/blob/master/src/ppopupmenu/PPopupMenu.java
であるという前提で推測の理由を述べますと・・・
PPopupMenuはswingのJPopupMenuの派生クラスとして実装されているようです。(32行目あたり)
このクラスはポップアップの表示をJPopupMenu#show(java.awt.Component, int, int)
メソッドを用いて行っています。(60行目あたり)第一引数のComponent型の値としてtargetフィールドの値、すなわちPAppletのインスタンスを指定している(※1)ことに注意してください。
さて、Processingのソースを見てみますと、PAppletクラスの実装はProcessing2/Processing3で異なっているようです。
Processing2: public class PApplet extends Applet implements PConstants, ... { ...
Processing3: public class PApplet implements PConstants { ...
Processing2ではPAppletはAppletの派生(つまりComponentの派生)だったのが、Processing3になってもはやAppletの派生クラスではなくなったということですね。PPopupMenuはProcessing2を用いてコンパイルされたのでしょう。このため※1に書いたJPopupMenu#showの第一引数にPAppletのインスタンスを渡すことが正当だったのだと思います。しかしppopupmenu.jarをそのままProcessing3で利用しようとすると(おそらくJVMがPPopupMenu.classをロードする際に)ベリファイアが働き「あれれ、起動するメソッドの引数の型に適合しないオブジェクトが渡されてるみたいだぞ。これはイカン」ということで、VerifyErrorが発生しているのだと思います。この例のようにJVMのベリファイアにひっかかるというケースはあまり目にしませんが、「コンパイルしたときのクラス定義がクラスロード時の実際の定義に矛盾している」というのが典型ケースの一つだと思います。
対処案
参考書籍のサンプルを試しておられるということで、多分その参考書籍はProcessing2前提のコードが記載されているのでしょうから、(前述の推測が正しければ)Processing2を用いるのが一番簡単だと思います。Processing2はProcessingのダウンロードページからダウンロードできますのでそちらをインストールして試してみてはいかがでしょう。
追記・訂正:
すみません、ご質問に「Processing1.5.1という昔のバージョンを入れて試してみましたが同じエラー」とあるのを見落としてました。自分の回答は「Processing3では動かなそう」ということしか言っておらず、「Procesing1.5.1で動かない原因」については何も言えてませんでした。ppopupmenuは2011年にコミット、その当時のProcessingのリリースバージョンはまだ2より前なので1.5.1でも同じエラーが出る理由が自分にはわかりません><
追記2:
最小限のテストをやってみました。
1.5.1は「JREがないよー」と言われて起動できませんでした。自分のPCにはjdk10.0.2しか入ってないのでそれをProcesing1.5.1が検出してくれないのかも知れません。
Procesing2.2.1でやってみたところ、とりあえず下記コードで期待通りの動作をするように見えました。
import ppopupmenu.*;
PPopupMenu menu;
void setup() {
size(200, 200);
menu = new PPopupMenu(this);
menu.addMenuItem("red", "foo");
}
void draw() {
}
void mouseClicked() {
if (mouseButton == RIGHT) {
menu.show(mouseX, mouseY);
}
}
void foo() {
println("foo: invoked");
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.32%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2018/10/20 20:36
回答ありがとうございます!返信が遅くなってしまいすみません。
Processing2を使い、書いていただいたコードを入れて試してみたらきちんと動作しました!ありがとうございます!
質問内で『Processing1.5.1という昔のバージョンを入れて試してみましたが同じエラーがでた』と書いたのですが、よくよくエラーを見たらまた別のエラーでした。すみません。
説明がとても丁寧で、本当に分かりやすかったです。コードまで書いてくださり本当にありがとうございます!