java - Android JNI错误: NoSuchMethodError: no non-static method

标签 java android c++ java-native-interface jnienv

下面简化了我想要做的事情。

  1. Java -> 调用 C++ 函数 A
  2. C++ 函数 A 调用 C++ 函数 B
  3. C++ 函数 B 调用 Java 方法 C

我必须存储 JVM(2) 和全局 jobject(3)。

但在第 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"

我总是遇到这个错误。

<小时/>

代码

结构

  • 包装器.java
  • native-lib.cpp
  • 包装器.cpp

** <-> 表示沟通

其他 Java 类 <-> Wrapper.java

Wrapper.java <-> native-lib.cpp

native-lib.cpp <-> Wrapper.cpp

Wrapper.cpp <-> 其他 C++ 类

<小时/>

包装器.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);
}

包装器.cpp

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

函数A

...
translater::setInputTS(input1, 100);  // error starts here

...

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

class translater{
public:

    inline static JavaVM *jvm = nullptr;
    inline static jobject model = nullptr;

    // from: https://stackoverflow.com/a/30026231/8176989
    static bool GetJniEnv(JavaVM *vm, JNIEnv **env);  

    static void predictTS(std::vector<float> &output);

    static void translater::setInputTS(float* input, int len) {


    JNIEnv *env;
    bool did_attach = GetJniEnv(jvm, &env);

    if(did_attach){


        jclass clazz = env->GetObjectClass(model);
        jmethodID jid_input = env->GetMethodID(clazz, "setInput", "([F)V");  // Here is where error happens

    }

    ...    
};

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;
    }

}

如何调用 jmethodID jid_input = env->GetMethodID(clazz, "setInput", "([F)V"); 正确吗?

最佳答案

这是因为 proguard 删除了未使用的代码,这有时可能是错误的。 我添加了混淆器设置,一切正常。

https://developer.android.com/studio/build/shrink-code#keep-code

.pro 文件

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

关于java - Android JNI错误: NoSuchMethodError: no non-static method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60518396/

相关文章:

java - Swing - 处理框架

java - 如何制作填充父级+wrap_content(按顺序)Android

java - 操作 JComboBox

java - 自动完成 TextView 的建议项目的布局

java - 错误 - 使用 DrawerLayout 的 Android 应用程序中出现 NullpointEException

android - 在 Android 7(API 级别 24)中,我的应用不允许将手机静音(将铃声模式设置为静音)

android - Caused by : java. lang.RuntimeException : com. android.builder.dexing.DexArchiveMergerException: Error while merging dex archives 错误

c++ - 到目前为止,我如何计算一个字符串中有多少个辅音

c++ - 如果默认构造函数不执行任何操作,其目的是什么?

c++ - 在 Mac Os X 上使用 CGEvent 和 Qt