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;
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
- 包装器
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。与任何编译器都无关。