当前位置: 首页 > 知识库问答 >
问题:

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

梁丘招
2023-03-14

我想做的是简化如下。

  1. 爪哇-

我必须存储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"

我总是犯这个错误。

结构

  • 包装纸。爪哇
  • 本地库。cpp
  • 包装纸。cpp

**

其他Java类

包装纸。JAVA

本地库。cpp

包装纸。cpp

包装纸。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

...

翻译。翻译员。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-


共有1个答案

慕弘深
2023-03-14

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

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

.pro文件

...
// added
-keep abstract class package.name.here.module.tfModel{
    *;
}
 类似资料:
  • 问题内容: 到目前为止,我有以下代码: } 当我尝试在末尾设置double 时,出现错误消息“无法对非静态方法进行静态引用”。它说解决方法是也使该方法静态化,但是我的教授告诉我不要将该字段静态化。有一个简单的解决方案我只是想念吗? 问题答案: 静态方法属于该类,非静态方法属于该类的 实例 。 当您从呼叫时,您会收到错误消息,因为它与任何实例都没有关联。 您需要创建该类的实例: 然后,您可以调用实例

  • 我试图在Android Studio中运行一个测试,测试设置抛出一个java.lang.NoSuchMethodError 测试: 有人知道正在发生什么,或者能给我指路? 编辑:当我在其他测试中创建一个实体的新实例时再次出现此错误,该实体在测试中是静态属性。

  • 问题内容: 我正在使用Android Studio(测试版),并且在“ onCreateView()”中使用此Java代码时,出现错误。 这是错误: 我该如何解决? 问题答案: 假设您在活动中有一个静态片段内部类:您正在尝试调用活动的活动,而该活动不能在不包含对父级引用的静态内部类中调用。 在其中,您需要在刚膨胀的根视图上调用它,例如

  • 我有一个简单的模式,有一个索引方法从数据库中获取数据 模态:国家 现在我想从控制器调用这个函数: 控制器: 为此,我以这种方式创建了一个正面: 创建了一个提供者 在config/app.php中注册了提供程序 创建了门面 在config/app.php中注册别名 第1步-提供商: php artisan make:提供者NationServiceProvider 第2步:在config/app.p

  • 问题内容: 我正在尝试使用此功能,但正在收到消息。 我可以简单地使其静态化,从而解决了我的问题,但是如果不走那条路线怎么办。我想保持方法非静态。 以下是一些代码,可让您了解发生了什么: 问题答案: 创建您的课程的实例 这是一个实例方法,它需要一个实例来访问它。请阅读有关类和对象的官方教程。

  • 问题内容: 我无法编译以下代码: 出现以下错误: 无法从静态内容引用非静态方法calcArea(int,int) 这是什么意思?我该如何解决该问题..? 编辑: 根据您的建议,我创建了一个新的test()实例,如下所示: 这样对吗?如果我这样做有什么区别… 问题答案: Nanne提出的建议绝对可以解决您的问题。但是,我认为如果现在就养成习惯,在学习Java的早期阶段,尝试尽可能少地使用静态方法(例