2

私はオンラインでたくさんの投稿を見つけましたが、それらのどれも私がそれを正しくするのを助けてくれなかったようです。

私の問題は、ndkc++部分からandroidjava関数を呼び出したいことです。

私がクラスを取得するとき:

jclass icls = jenv->GetObjectClass(obj);

このエラーが発生します: E / AndroidRuntime(27397):java.lang.NoSuchMethodError:クラスLjava / lang/Classにname='setValues'signature='()V'のメソッドがありません。 => jmid == 0

以下のように「FindClass」で呼び出すと、次のエラーが発生します。A / libc(26692):0x00000004(code = 1)の致命的なシグナル11(SIGSEGV)、スレッド26743(Thread-8302)

findclassとメソッドは機能しているようです(!= 0)ので、 objに問題がある可能性がありますか?

誰?事前にThx..

JAVA-メインクラス:

package com.new.test;
class Test{
   public Test(Context context, AttributeSet attrs) {
        super(context, attrs);
        run();
   }

   run(){
         int x = 10;
         new DoStuff(x);
   }
   public void setValues(){     
       Log.e("","SET VALUES");
   }
}

JAVA 2 JNI:

public class DoStuff{   
    public DoStuff(int x){
        nativeDoStuff(x);
    }

    private static native long nativeDoStuff(int x);

    static{
        System.loadLibrary("do_stuff");
    }
}

C ++:cpp

JNIEXPORT void JNICALL Java_com_new_test_DoStuff_nativeDoStuff (JNIEnv * jenv, jobject obj, jint x){

    jclass icls = jenv->FindClass("com/new/test/Test");
    //jclass icls = jenv->GetObjectClass(obj);
    jmethodID jmid = jenv->GetMethodID(icls, "setValues","()V");
    jenv->CallVoidMethod(obj,jmid);

}

C ++:h

JNIEXPORT void JNICALL Java_com_new_test_DoStuff_nativeDoStuff (JNIEnv *, jobject, jint);
4

3 に答える 3

2

これを正しく読んでいると、この場合の「obj」は、Testオブジェクトではなく、DoStuffオブジェクトを指します。したがって、このメソッドを含まないオブジェクトでsetValuesメソッドを呼び出そうとしています。ネイティブメソッドをTestのメンバーにするか、Testのインスタンスを関数に渡す必要があります。

于 2013-03-25T19:11:21.717 に答える
2

このメソッドTest.setValues()はインスタンスメソッドですTest。実行するには有効なオブジェクトが必要です。一方、メソッドにnativeDoStuffはありません。これは静的メソッドであり、(2番目のパラメーターとして)クラスDoStuffのクラスオブジェクトだけがあります。thisそのクラスポインタを誤ってへのポインタとして渡していますCallVoidMethod()-それは致命的に間違っています。

すべてを1つのクラスに移動し(TestまたはDoStuff、どちらでも構いません)nativeDoStuff()、Java側で非静的として宣言します。または、doStuff()それ自体を静的にしjenv->CallStaticVoidMethod()て、最後の行として使用します。

于 2013-03-25T20:09:01.117 に答える
0

でボイドを変更してみてください:

JNIEXPORT void JNICALL Java_com ...

jlong​​に。

于 2013-03-25T22:24:34.260 に答える