Android jni:cpp jni找不到java类的内部类。想要返回一个java类来调用cpp jni函数

时间:2015-12-01 11:07:45

标签: android android-ndk java-native-interface

我的代码中出现以下错误。我无法解决它。 java.lang.ClassNotFoundException:在路径上找不到类“com.graphics.package1。 javaClass1 $ innerClass ”:DexPathList [[directory“。”],nativeLibraryDirectories = [/ vendor / lib,/系统/ lib中]]

我尝试过不同的签名,例如com / graphics / package1 / javaClass1 $ innerClass com / graphics / package1 / javaClass1 / innerClass等但是,它没有解决问题

Java代码如下

xyz.java

package com.graphics.package1;

public class javaClass1 {
==========

    public class innerClass {
        public int a;
        public float b;
    }

    public innerClass getJavaClass() {

        innerClass new_innerClass = new innerClass();
        new_innerClass.a = 2;
        new_innerClass.b = 10.5;
        return new_innerClass;
    }

以下是我的jni代码(.cpp)代码。这会调用应返回类的java函数。我已经简化了代码,以便您更容易理解。

typedef struct {
   int a;
   float b;
} CppStruct;

bool checkException(JNIEnv* env) {
    if (env->ExceptionCheck()) {
        env->ExceptionDescribe(); // writes to logcat
        env->ExceptionClear();
        return true;
    }
    return false;
}

bool getClass(CppStruct* cppStruct, int num) {
    jboolean result = false;


    int status = g_JavaVM->GetEnv((void **) &envLocal, JNI_VERSION_1_6);
    if (status < 0) {
        status = g_JavaVM->AttachCurrentThread(&envLocal, NULL);
        if (status < 0) {
            return false;
        }
    }

    if (envLocal == NULL) {
        return false;
    }

    if (g_clazz == NULL) {
        return false;
    }

**// Fine the inner class of java javaClass1. This fails with exception.**
    jclass jcppStructClass = envLocal->FindClass("com/graphics/package1/**javaClass1$innerClass**");

    if (checkException(envLocal)) {
        __android_log_print(ANDROID_LOG_ERROR, "TAG",
                "Exception occurred in jcppStructClass");
    }

**// next is to call the java method to get the java class object. This has not reached here but please guide here too.**
jmethodID methodID_getJavaClass = envLocal->GetMethodID(g_clazz,
        "getJavaClass", "()Lcom/graphics/package1/javaClass1/innerClass;");

if (methodID_getJavaClass != NULL) {
        jobject jCoreStatusClassObject = envLocal->CallStaticObjectMethod(g_clazz, methodID_getJavaClass, num);
        if (checkException(envLocal)) {
            __android_log_print(ANDROID_LOG_ERROR, "TAG",
                    "Exception occurred in CallStaticObjectMethod");
        }
        // I will fill cppStruct but, I know this will also fail because of the signature
        g_JavaVM->DetachCurrentThread();
        return true;
    } else
    return false;
}

0 个答案:

没有答案