2

我在网上找到了很多帖子,但似乎没有一个可以帮助我做对。

我的问题是我想从 ndk c++ 部分调用一个 android java 函数。

当我上课时:

jclass icls = jenv->GetObjectClass(obj);

我收到此错误: E/AndroidRuntime(27397): java.lang.NoSuchMethodError: no method with name='setValues' signature='()V' in class Ljava/lang/Class; => jmid == 0

当我用“FindClass”像下面这样调用它时,我收到此错误:A/libc(26692): Fatal signal 11 (SIGSEGV) at 0x00000004 (code=1), thread 26743 (Thread-8302)

findclass 和方法似乎有效(!= 0)所以obj可能有问题吗?

任何人?提前谢谢..

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++: 小时

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

3 回答 3

2

如果我没看错的话,在这种情况下,“obj”将指向 DoStuff 对象,而不是 Test 对象。因此,您尝试在不包含此方法的对象上调用 setValues 方法。您应该使您的本机方法成为 Test 的成员,或者将 Test 的实例传递给函数。

于 2013-03-25T19:11:21.717 回答
2

该方法Test.setValues()是一个实例方法 - 它需要一个有效的Test对象才能执行。同时,该方法nativeDoStuff没有。它是一个静态方法,它所拥有的(作为第二个参数)是 DoStuff 类的一个类对象。您错误地将该类指针作为指向的this指针传递CallVoidMethod()- 这是致命的错误。

将所有内容移动到一个类中(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 回答