2017-10-10 6 views
0
jclass class= env->FindClass("java/util/ArrayList"); 

listClass = (jclass)env->NewGlobalRef(class); 

listAddAllID = env->GetMethodID(listClass, "addAll", "(Ljava/lang/Object;)Z"); 

でのaddAll ArrayListのために、私は上記のコード「java.lang.NoSuchMethodErrorの:のaddAll」の次の例外得た.Iは、パラメータと戻り型booleanは「Z」の「のlang /オブジェクト」を用います。それはまったく正しいようです。私はここで何が欠けていますか?NoSuchMethodError JNI

public boolean addAll(Collection c)

+2

'Collection'は' Object [] 'と非常に異なります。野生の推測: 'env-> GetMethodID(listClass、" addAll "、"(java/util/Collection;)Z ")' –

+0

オブジェクトをコレクションに変更することで動作します。ありがとうジャイロ。 –

答えて

1

あなたはいつも

> javap -s java.util.ArrayList | grep -A +1 addAll 
    public boolean addAll(java.util.Collection<? extends E>); 
    descriptor: (Ljava/util/Collection;)Z 
-- 
    public boolean addAll(int, java.util.Collection<? extends E>); 
    descriptor: (ILjava/util/Collection;)Z 

だから、あなたは(あなたがしたいの呼び出しに応じて)次のいずれかにそれを変更する必要がある方法の適切な記述子を取得するためにjavapを使用することができます。

JNIで楽しんでください!

+0

私は、上記のコマンドを試してみて、明確なアイディアを得ました。 –

+1

.oOo。すばらしいです! JNIとお楽しみください! .oOo。 – mko

0

It seems to be right completely.

理解できない。それは完全に間違っています。 APIは、パラメータがCollectionであることを示します。

これらのことを推測したり、JNIメソッドのシグネチャを自分で記述したりしないでください。 javap -sの出力を使用します。決して間違ってはいません。

+0

あなたが言うまで、これを知らないでください。本当に良い方法でJNIメソッドを書くことができます。ありがとう。 –

関連する問題