【问题标题】:Trying to call function from JNI, but I get No implementation found试图从 JNI 调用函数,但我得到 No implementation found
【发布时间】:2020-07-04 21:48:51
【问题描述】:

我正在尝试使用 ndk/jni 调用本机函数,但出现此异常

java.lang.UnsatisfiedLinkError: No implementation found for java.lang.String 
com.raya.aman.ToolModule.stringFromJNI() (tried Java_com_raya_aman_ToolModule_stringFromJNI and 
Java_com_raya_aman_ToolModule_stringFromJNI__)

这是 Java 类

package com.raya.aman;
public class ToolModule {
public native String stringFromJNI();
static {
    System.loadLibrary("nljnitest");
}
}

这是原生函数

jstring Java_com_raya_aman_ToolModule_stringFromJNI(JNIEnv* env, jobject  obj) {
   char * hello = "Hello from Native";
  return (*env)->NewStringUTF(env, hello);
}

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE        := nljnitest
LOCAL_C_INCLUDES    += $(LOCAL_PATH)/
LOCAL_SRC_FILES     +=  FieldTest.c  log.c
LOCAL_LDLIBS        += -llog
include $(BUILD_SHARED_LIBRARY)

应用程序.mk

NDK_TOOLCHAIN_VERSION := 4.9
APP_ABI :=  armeabi-v7a arm64-v8a
APP_CFLAGS += -Wno-error=format-security

我将此添加到我的 gradle 中

sourceSets {
    main {
        jniLibs.srcDirs = ['libs']
    }
}

this is my file structure

jni files

【问题讨论】:

  • 您的 C 函数声明不正确。而不仅仅是jstring,它应该是JNIEXPORT jstring JNICALL
  • 另外,你应该去掉NDK_TOOLCHAIN_VERSION := 4.9,因为 NDK 不再支持 GCC。
  • @Michael 我更改为 JNIEXPORT jstring JNICALL 但我得到了相同的异常说明,我从工作演示中获取了这个函数
  • @Michael 我从 Application.mk 中删除了 NDK_TOOLCHAIN_VERSION := 4.9 但同样的问题
  • 与其尝试使用一些可能非常古老的示例,不如直接使用 Android Studio 的项目向导创建一个启用了 C++ 支持的新项目并将其用作模板?或者查看 Google 自己的 NDK 示例之一:github.com/android/ndk-samples/tree/master/hello-jni

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


【解决方案1】:

函数是否存在于 .cpp/.cxx 文件中?

声明为

extern "C" string Java_com_raya_aman_ToolModule_stringFromJNI(JNIEnv* env, jobject  obj)

否则,导出的函数名会根据 C++ 规则被破坏。

【讨论】:

  • 使用 readelf -s 检查库的导出(readelf 在NDK\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin 下)。如果你的功能在那里?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-19
  • 2016-05-07
  • 1970-01-01
  • 1970-01-01
  • 2019-01-13
  • 2021-10-28
相关资源
最近更新 更多