Android 使用.so文件时未找到任何实现

Android 使用.so文件时未找到任何实现,android,android-ndk,shared-libraries,implementation,.so,Android,Android Ndk,Shared Libraries,Implementation,.so,我想使用其他项目中的本机库。这是我的图书馆。 这是我第一次在android studio中使用ndk。我成功加载了library.so,但在访问文件时失败。这里是错误 下面是我加载库的java代码。 这是我的主要java代码 你能解决我的问题吗?谢谢您的C部件缺少JNI层。要让Java本机接口GetLibVersion()能够在C部分中找到匹配的函数,您需要使用Java\u ai\u widya\u mediatekso\u JniLoader\u GetLibVersion(JNIEn

我想使用其他项目中的本机库。这是我的图书馆。

这是我第一次在android studio中使用ndk。我成功加载了library.so,但在访问文件时失败。这里是错误

下面是我加载库的java代码。

这是我的主要java代码


你能解决我的问题吗?谢谢

您的C部件缺少JNI层。要让Java本机接口
GetLibVersion()
能够在C部分中找到匹配的函数,您需要使用
Java\u ai\u widya\u mediatekso\u JniLoader\u GetLibVersion(JNIEnv*env,jobject thiz)
定义一个C函数名,正如崩溃日志告诉您的那样。不要错过C函数中的JNI参数。
如果希望在C部分中使用与Java部分完全相同的函数名,可以向JVM注册一个新名称。在JNI_Onload()中调用下面的函数

static int registerNativeMethods(JNIEnv*env)
{
jclass-clazz;
const char*className=“ai/widya/mediatekso/JniLoader”;
clazz=env->FindClass(类名);
if(clazz==NULL){
ALOGE(“本机注册无法找到类“%s”,类名称);
返回JNI_FALSE;
}
JniationMethod方法[]={
{“GetLibVersion”,“()V”,(void*)GetLibVersion},
{“GetProtoVersion”、“()V”、(void*)GetProtoVersion},
};
如果(环境->注册表项(类别、方法2)<0){
ALOGE(“注册表项对“%s”失败,类名);
返回JNI_FALSE;
}
返回JNI_TRUE;
}

不要忘记在C函数中添加JNI参数,如下面的
GetLibVersion(JNIEnv*env,jobject thiz)

您的C部件中缺少JNI层。要让Java本机接口
GetLibVersion()
能够在C部分中找到匹配的函数,您需要使用
Java\u ai\u widya\u mediatekso\u JniLoader\u GetLibVersion(JNIEnv*env,jobject thiz)
定义一个C函数名,正如崩溃日志告诉您的那样。不要错过C函数中的JNI参数。
如果希望在C部分中使用与Java部分完全相同的函数名,可以向JVM注册一个新名称。在JNI_Onload()中调用下面的函数

static int registerNativeMethods(JNIEnv*env)
{
jclass-clazz;
const char*className=“ai/widya/mediatekso/JniLoader”;
clazz=env->FindClass(类名);
if(clazz==NULL){
ALOGE(“本机注册无法找到类“%s”,类名称);
返回JNI_FALSE;
}
JniationMethod方法[]={
{“GetLibVersion”,“()V”,(void*)GetLibVersion},
{“GetProtoVersion”、“()V”、(void*)GetProtoVersion},
};
如果(环境->注册表项(类别、方法2)<0){
ALOGE(“注册表项对“%s”失败,类名);
返回JNI_FALSE;
}
返回JNI_TRUE;
}
不要忘记在C函数中添加JNI参数,如下面的
GetLibVersion(JNIEnv*env,jobject thiz)

对于您在评论中提供的示例项目,生活真的很简单

您需要项目中的文件
。从GitHub下载它而不更改类名或包,并在Java应用程序中使用它,就像他们在自己的应用程序中所做的那样。

使用您在注释中提供的示例项目,生活真的很简单


您需要项目中的文件
。从GitHub下载它,而不更改类名或包,并在Java应用程序中使用它,就像在其应用程序中一样。

如果您想重用现有的本机库,应该使用它附带的Java类。在最坏的情况下,您可以尝试自己通过反向工程so文件来复制这些类。如何反向工程so文件?有什么建议或教程链接吗?让我用一个问题回答你的问题。您试图调用方法GetLibVersion()。为什么你认为它应该存在于libsmart\u connection\u jni中呢?我有一个示例项目,其中包括jni文件夹和libs。这里是链接。我想在android native/android studio上实现它。我已经读到,我们只需要.so文件,这样我们就可以在不重新生成c文件的情况下获得库。和GetLibVersion()存在于jni文件夹中。发布代码,而不是代码图片。如果要重用现有的本机库,应使用随附的Java类。在最坏的情况下,您可以尝试自己通过反向工程so文件来复制这些类。如何反向工程so文件?有什么建议或教程链接吗?让我用一个问题回答你的问题。您试图调用方法GetLibVersion()。为什么你认为它应该存在于libsmart\u connection\u jni中呢?我有一个示例项目,其中包括jni文件夹和libs。这里是链接。我想在android native/android studio上实现它。我已经读到,我们只需要.so文件,这样我们就可以在不重新生成c文件的情况下获得库。和GetLibVersion()存在于jni文件夹中。发布代码,而不是代码的图片。所以我必须创建一个c文件?所以我必须创建一个c文件?噢,它现在工作了:)。还有另一个问题,如果我想更改库的逻辑,是否可以在.so文件中进行更改?如果可以,你能用英语回答这个问题吗?我想更改.c文件的逻辑,但我不知道如何使用这些文件,我想在更改逻辑之前先让它工作。它像以前一样使用相同的github文件:)噢,现在可以工作了:)。还有另一个问题,如果我想更改库的逻辑,是否可以在.so文件中进行更改?如果可以,你能用英语回答这个问题吗?我想更改.c文件的逻辑,但我不知道如何使用这些文件,我想在更改逻辑之前先让它工作。它使用与以前相同的github文件:)
static int registerNativeMethods(JNIEnv* env)
{
    jclass clazz;
    const char* className = "ai/widya/mediatekso/JniLoader";
    clazz = env->FindClass(className);
    if (clazz == NULL) {
        ALOGE("Native registration unable to find class '%s'", className);
        return JNI_FALSE;
    }
    JNINativeMethod methods[] = {
        {"GetLibVersion", "()V", (void*) GetLibVersion },
        {"GetProtoVersion", "()V", (void*) GetProtoVersion },
    };
    if (env->RegisterNatives(clazz, methods, 2) < 0) {
        ALOGE("RegisterNatives failed for '%s'", className);
        return JNI_FALSE;
    }
    return JNI_TRUE;
}