Java Android JNI错误:NoSuchMethodError:无非静态方法

Java Android JNI错误:NoSuchMethodError:无非静态方法,java,android,c++,java-native-interface,jnienv,Java,Android,C++,Java Native Interface,Jnienv,我想做的是简化如下 java ->调用C++函数a C++函数调用C++函数B C++函数B调用Java方法C 我必须存储JVM(2)和全局jobject(3) 但在第三部分 JNI DETECTED ERROR IN APPLICATION: JNI CallVoidMethodV called with pending exception java.lang.NoSuchMethodError: no non-static method "Lpackage/name/here/d/b;

我想做的是简化如下

java ->调用C++函数a
  • C++函数调用C++函数B
  • C++函数B调用Java方法C
  • 我必须存储JVM(2)和全局jobject(3)

    但在第三部分

    JNI DETECTED ERROR IN APPLICATION: JNI CallVoidMethodV called with pending exception java.lang.NoSuchMethodError: no non-static method "Lpackage/name/here/d/b;.setInput([F)V"
    
    我总是犯这个错误


    代码 结构

    • Wrapper.java
    • native-lib.cpp
    • 包装器
    **手段沟通

    其他Java类Wrapper.Java

    private static long wrapperAddr = 0; // initializes later
    
    private tfModel model;
    private native void nativeSetModel(long native_ptr, tfModel model);
    
    public Wrapper(...){
        ...
    
        model = tfModel.create(tfModel.Model.MNIST, tfModel.Device.CPU, 1);
        nativeSetModel(wrapperAddr, model);
    }
    
    Wrapper.java native-lib.cpp

    extern "C" JNIEXPORT void JNICALL
    Java_package_name_here_jni_Wrapper_nativeSetModel(JNIEnv *env,
                                                          jobject instance,
                                                          jlong native_ptr,
                                                          jobject model){
    
      auto wrapper = reinterpret_cast<Wrapper *>(native_ptr);
    
      wrapper->setModel(env, model);
    }
    
    native-lib.cpp Wrapper.cpp

    void setModel(JNIEnv *env, jobject _model){
        env->GetJavaVM(&translater::jvm);    
        jobject gmodel = env->NewGlobalRef(_model);    
        translater::model = gmodel;
      }
    

    WrAPP.CPP其他C++类< /P>


    Wrapper.java

    private static long wrapperAddr = 0; // initializes later
    
    private tfModel model;
    private native void nativeSetModel(long native_ptr, tfModel model);
    
    public Wrapper(...){
        ...
    
        model = tfModel.create(tfModel.Model.MNIST, tfModel.Device.CPU, 1);
        nativeSetModel(wrapperAddr, model);
    }
    
    native-lib.cpp

    extern "C" JNIEXPORT void JNICALL
    Java_package_name_here_jni_Wrapper_nativeSetModel(JNIEnv *env,
                                                          jobject instance,
                                                          jlong native_ptr,
                                                          jobject model){
    
      auto wrapper = reinterpret_cast<Wrapper *>(native_ptr);
    
      wrapper->setModel(env, model);
    }
    
    功能A

    translater.h/translater.cpp(函数B)

    类转换器{
    公众:
    内联静态JavaVM*jvm=nullptr;
    内联静态作业对象模型=nullptr;
    //发件人:https://stackoverflow.com/a/30026231/8176989
    静态bool GetJniEnv(JavaVM*vm,JNIEnv**env);
    静态无效预测(标准::向量和输出);
    静态无效转换器::设置输入(浮点*输入,整数长度){
    JNIEnv*env;
    bool did_attach=GetJniEnv(jvm和env);
    如果(是否附加){
    jclass clazz=env->GetObjectClass(模型);
    jmethodID jid_input=env->GetMethodID(clazz,“setInput”,“([F)V”);//下面是发生错误的地方
    }
    ...    
    };
    
    tfModel.java

    public abstract class tfModel{
    ...
    
        public void setInput(float[] array){
            if(inputIndex < inputImageNum)
                setInput_Image(inputIndex, array);
            else
                setInput_Tensor(inputIndex - inputImageNum, array);
    
            ++inputIndex;
        }
    
    }
    
    
    公共抽象类模型{
    ...
    公共void setInput(浮点[]数组){
    if(inputIndex
    我怎么打电话
    jmethodID jid_input=env->GetMethodID(clazz,“setInput”和“([F)V”);

    正确吗?

    这是因为愚蠢的编译器优化。 我添加了proguard设置,一切正常

    .pro文件

    ...
    // added
    -keep abstract class package.name.here.module.tfModel{
        *;
    }
    

    这是因为ProGuard。与任何编译器都无关。