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

在Android中使用jni:UNsatisfiedLinkError

仇航
2023-03-14

我对jni是新手,我正在阅读一个教程来实现一个简单的本机方法,但我得到了一个不满意的LinkError。据我所知,我完全按照教程中的步骤进行了操作。请帮帮我.

下面是java包装器代码:

package com.cookbook.jni;

public class SquaredWrapper {

    // Declare native method (and make it public to expose it directly)
    public static native int squared(int base);

   // Provide additional functionality, that "extends" the native method
   public static int to4(int base)
   {
      int sq = squared(base);
      return squared(sq);
   }

   // Load library
   static {
      System.loadLibrary("squared");
   }
}

下面是我的Android.mk文件的样子:

#include "squared.h"
#include <jni.h>

JNIEXPORT jint JNICALL Java_org_edwards_1research_demo_jni_SquaredWrapper_squared
  (JNIEnv * je, jclass jc, jint base)
{
     return (base*base);
}

下面是我的。h文件的样子:

enter code here/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_cookbook_jni_SquaredWrapper */

#ifndef _Included_com_cookbook_jni_SquaredWrapper
#define _Included_com_cookbook_jni_SquaredWrapper
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:     com_cookbook_jni_SquaredWrapper
* Method:    squared
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_com_cookbook_jni_SquaredWrapper_squared
  (JNIEnv *, jclass, jint);

#ifdef __cplusplus
}
#endif
#endif

共有1个答案

张照
2023-03-14

你的JNI签名不匹配。在。c文件中,更改:

JNIEXPORT jint JNICALL Java_org_edwards_1research_demo_jni_SquaredWrapper_squared

JNIEXPORT jint JNICALL Java_com_cookbook_jni_SquaredWrapper_squared

通常有两种方法可以通过JNI将本机C“粘合”到Java函数上。第一个是您在这里试图做的,即使用一个预先确定的签名,JNI将识别该签名并将其与适当的Java代码相关联。第二种方法是在包含库时将函数指针、签名和Java类名传递到JNI中。

#include "squared.h"
#include <jni.h>

static const char* SquaredWrapper = "com/cookbook/jni/SquaredWrapper";

jint squared(JNIEnv * env, jobject this, jint base) {
     return (base*base);
}

// Methods to register for SquaredWrapper
static JNINativeMethod SquareWrapperMethods[] = {
        {"squared", "(I)I", squared}
};

jint JNI_OnLoad(JavaVM* vm, void* reserved) {
    JNIEnv* env;
    if ( (*vm)->GetEnv(vm, (void **) &env, JNI_VERSION_1_6) != JNI_OK)
        return JNI_ERR;

    jclass class = (*env)->FindClass(env, SquaredWrapper);
    (*env)->RegisterNatives(env, class, SquaredWrapperMethods, sizeof(SquaredWrapperMethods)/sizeof(SquaredWrapperMethods[0]));

    return JNI_VERSION_1_6;
}

void JNI_OnUnload(JavaVM* vm, void* reserved) {
    JNIEnv* env;
    if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_6) != JNI_OK)
        return;

    jclass class = (*env)->FindClass(env, SquaredWrapper);
    (*env)->UnregisterNatives(env, class);

    return;

}
 类似资料:
  • 我需要一些关于我目前正在进行的项目的指导-我正在进行一个与BLE设备s. t.通信的项目。该设备连接到android手机并偶尔传输一些数据。我看了一些关于BLE与android设备通信的讲座,并阅读了一些关于android 4.3蓝牙API的信息,但有些东西我还没有得到 > 如果我希望我的应用程序向后兼容(高达2.3),这可能吗?他们(Google)在支持包中包含新功能吗? 我在哪里可以找到一些使

  • 问题内容: 我正在尝试从Webview中的javascript界面​​开始一项活动。该示例显示了一个烤面包。我怎么能称呼课程而不是敬酒? 这是html页面。 问题答案: 您必须先在Webview上注册JavaScriptInterface。JavaScriptInterFace可以是一个内部类,如下所示。此类将具有您可以从html页面(通过javaScript)调用的函数,并且可以在该函数内部编写

  • 在Android 5.0中使用JobScheduler 原文链接 : using-the-jobscheduler-api-on-android-lollipop 译文出自 : 开发技术前线 www.devtf.cn 译者 : Mr.Simple 校对者 : Mr.Simple 在这篇文章中,你会学习到在Android 5.0中如何使用JobScheduler API。JobScheduler A

  • 问题内容: 我有一个使用apache旧版Http库(org.apache.http.legacy)的旧android应用。在Android 6上进行更改后,我能够使该应用程序(包括旧版库)保持正常运行。 useLibrary’org.apache.http.legacy ‘。 现在,在Android 9设备上,我在运行时得到以下异常。 阅读Android 9更改文档 ,在AndroidManife

  • 所以我正在开发一个需要能够发送和接收http请求的应用程序,我读到了关于Volley的文章。 我遵循了这个线程中的步骤,考虑了gradle中某些不推荐使用的方法(compile vs Implement),但当我尝试使用volley类创建请求时,它们不会被识别。 任何关于什么可能是向上的和/或什么我应该检查的想法将非常感谢!

  • 我无法在android emulator中使用pdfbox运行pdf文本提取。但是,当作为独立java应用程序运行时,代码运行良好。 使用了PDFBOXv1.8.4,并且使用pdfbox jar适当地设置了构建路径。可能会出什么问题? 我还看到一些帖子建议不要使用pdfbox,因为android库不支持drawables(java.awt.*)。真的是这样吗?我还能希望用pdfbox解析我的简单p