【问题标题】:" Cannot Resolve Corresponding JNI Function" Android Studio《无法解析对应的 JNI 函数》Android Studio
【发布时间】:2017-03-20 21:19:38
【问题描述】:

本机代码 本机.c

#include <string.h>
#include <stdio.h>
#include <jni.h>

jstring Java_com_lab5_oli_myapplication_MainActivity_helloWorld(JNIEnv* env,jobject obj)
{
    return (*env)->NewStringUTF(env,"Hello world");
}

Android.mk 文件

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE:=ocrex
LOCAL_SRC_FILES:=ndkTest.c

include $(BUILD_SHARED_LIBRARY)

Application.mk 文件

APP_ABI := all

MainActivity 中的代码

public native String helloWorld();
static{
    System.loadLibrary("ocrex");
}

该方法被识别为在本机代码中声明(侧栏注释)

【问题讨论】:

  • 您的JNI_OnLoad() 函数在哪里?那么你的 c 到 java 映射的函数表呢?如果这是您的全部代码,那么您缺少很多部分。我建议你拿一本关于 Android 和 JNI 的书。

标签: android android-ndk


【解决方案1】:

首先,如果您使用的是 android studio 2.2 及更高版本,请使用 Cmake,因为 Android Studio 的原生库的默认构建工具是 CMake。但是如果你需要ndk-build android studio 还是支持ndk-build。

1) 将 JNIEXPOT 和 JNICALL 添加到 native 方法中,并确保 com_lab5_oli_myapplication 是 MainActivity 类的包名。

#include <string.h>
#include <stdio.h>
#include <jni.h>

JNIEXPORT jstring  JNICALL Java_com_lab5_oli_myapplication_MainActivity_helloWorld(JNIEnv* env,jobject obj)
{
    return (*env)->NewStringUTF(env,"Hello world");
}

2) 在 Android.mk 文件中更改源名称,您的 c++ 名称为 native.c,但在 Android.mk 文件中您使用的是 ndkTest.c 文件名。

LOCAL_SRC_FILES:=ndkTest.c
//change it to 
LOCAL_SRC_FILES:=native.c

最后,您必须将 gradle 链接到本机库。 1) 如果你有 android studio 2.2 及更高版本,请右键单击该应用程序,并且有带有 gradle 的 Link c++ 项目。如果您使用的是 ndk-build,则选择 Android.mk 文件,如果您使用的是 Cmake 构建,请选择插入 CmakeLists 的地址。 2)您还可以手动配置 gradle 以包含本机库。您需要将 externalNativeBuild 块添加到模块级 build.gradle 文件并使用 cmake 或 ndkBuild 块进行配置: 如果你使用的是 cmake

 externalNativeBuild {

    // Encapsulates your CMake build configurations.
    cmake {

      // Provides a relative path to your CMake build script.
      path "CMakeLists.txt"
    }
  }

如果你使用的是 ndk-build

externalNativeBuild {

    // Encapsulates your CMake build configurations.
    ndkBuild {

      // Provides a relative path to your to the Android.mk build script.
      path "Android.mk"
    }
  }

有关 android 中 cmake 和 ndk 的详细信息,请使用 thisthis

【讨论】:

  • 仍然有同样问题的错误。 android studio 说无法解决。我遇到了崩溃,没有找到该 jni 函数调用的实现。我检查了我的文件夹,它确实编译了一个 .so 文件。
  • 你使用的是 Cmake 还是 NDK-build?
  • NDK 构建。我解决了我的问题。由于重构接口 java 类,jni 导出函数名称与包名称不匹配。非常感谢。
  • 对于新项目谷歌推荐 Cmake。由于其成熟的语法,CMake 是一种更有效的构建 C/C++ 代码的方法。 developer.android.com/ndk/guides/cmake.html
  • 好吧,有没有从 ndk 到 cmake 的翻译器?我正在使用没有提供 cmake 示例的 android 库(OpenCV)。
猜你喜欢
  • 2017-11-09
  • 2018-07-05
  • 2017-10-12
  • 1970-01-01
  • 1970-01-01
  • 2016-02-01
  • 1970-01-01
相关资源
最近更新 更多