java.lang.classnotfoundexception:在路径上:dexpathlist[[directory”“],nativelibrarydirectories=[/system/lib64,/system/lib64]]

t9eec4r0  于 2021-09-13  发布在  Java
关注(0)|答案(1)|浏览(515)

目前,库(.so)是使用VisualStudio构建的,并放在jnilibs目录中。如下图所示,

在jni调用中查找类时获得以下异常(此处为twmainactivity,但对于任何其他类为true),

2021-07-23 08:10:43.992 13617-1658/com.tally.twandroidconsolesimulator A/onsolesimulato: java_vm_ext.cc:578] JNI DETECTED ERROR IN APPLICATION: JNI GetMethodID called with pending exception java.lang.ClassNotFoundException: Didn't find class "com.tally.twandroidconsolesimulator.TWMainActivity" on path: DexPathList[[directory "."],nativeLibraryDirectories=[/system/lib64, /system/lib64]]
    java_vm_ext.cc:578]   at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:207)
    java_vm_ext.cc:578]   at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:379)
    java_vm_ext.cc:578]   at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312)
    java_vm_ext.cc:578] 
    java_vm_ext.cc:578]     in call to GetMethodID

而通过对通过jni调用传递的对象的全局引用(java到c++),能够获得 jclass .

//this is working
    jclass      cls = env->GetObjectClass (sMainActivityGlobalRef);

   //this is not working throwing mentioned exceptions
  //  jclass       cls = env->FindClass ("com/tally/twandroidconsolesimulator/TWMainActivity");

注意:相同的代码在没有jnilibs的情况下使用andrdoidstudio本机项目
基本代码流程如下:,

public class TWMainActivity extends AppCompatActivity {

    static {
        System.loadLibrary("TWXPControlsGalleryApp_arm64-v8a");
    }
 @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);               
            InitializeMain();
        }
        public native void InitializeMain();
 }

//本机代码

static void
NativeThread(JavaVM * pJavaVm, jint pJVersion, jobject pObjGblRfrnc){
    JNIEnv * env;
    auto    get_env_result = vm->GetEnv ((void**) &env, pJVersion);
    if (get_env_result == JNI_EDETACHED) {
        if (vm->AttachCurrentThread (env, nullptr) != JNI_OK) {
            return;
        }
    }
        jclass      cls = env->FindClass ("com/tally/twandroidconsolesimulator/TWMainActivity");

    //... rest of the code follows here
}

extern "C" JNIEXPORT void JNICALL 
Java_com_tally_twandroidconsolesimulator_TWMainActivity_InitializeMain (JNIEnv * pEnv, jobject pObj)
{
            JavaVM * sJavaVm;

        jint jv_version = pEnv->GetVersion ();
        pEnv->GetJavaVM (&sJavaVm);    
        jobject ref = pEnv->NewGlobalRef (pObj);

    std::thread thread1 (NativeThread, sJavaVm, jv_version, ref );
    thread1.detach ();
}

已经提过这个这个这个但是没有帮到纠正问题。
环境:

classpath "com.android.tools.build:gradle:4.2.1"


我很感激任何暗示。

mrzz3bfm

mrzz3bfm1#

FindClass 如果在纯本机线程上调用,将无法找到任何特定于应用程序的类,因为使用了错误的类加载器。有关更多信息,请参阅android开发者文档中的本节。
有多种方法可以解决此问题,但最简单的方法可能是解决中的所有类 JNI_OnLoad ,创建对它们的全局引用,并将这些全局引用保存在其他代码可以访问它们的地方。

相关问题