我在网上找到了很多帖子,但似乎没有一个可以帮助我做对。
我的问题是我想从 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);