"无法解析相应的JNI功能"Android Studio

Oli*_*tea 10 android android-ndk

本机代码native.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");
}
Run Code Online (Sandbox Code Playgroud)

Android.mk文件

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE:=ocrex
LOCAL_SRC_FILES:=ndkTest.c

include $(BUILD_SHARED_LIBRARY)
Run Code Online (Sandbox Code Playgroud)

Application.mk文件

APP_ABI := all
Run Code Online (Sandbox Code Playgroud)

MainActivity中的代码

public native String helloWorld();
static{
    System.loadLibrary("ocrex");
}
Run Code Online (Sandbox Code Playgroud)

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

Yir*_*rga 6

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

1)将JNIEXPOT和JNICALL添加到本机方法中,并确保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");
}
Run Code Online (Sandbox Code Playgroud)

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

LOCAL_SRC_FILES:=ndkTest.c
//change it to 
LOCAL_SRC_FILES:=native.c
Run Code Online (Sandbox Code Playgroud)

最后,您必须将gradle链接到本​​机库.1)如果您有android studio 2.2及以上版本,请右键单击该应用程序并使用gradle链接c ++项目.如果您使用的是ndk-build,那么如果您使用的是Cmake build,请选择Android.mk文件,选择插入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"
    }
  }
Run Code Online (Sandbox Code Playgroud)

如果你正在使用ndk-build

externalNativeBuild {

    // Encapsulates your CMake build configurations.
    ndkBuild {

      // Provides a relative path to your to the Android.mk build script.
      path "Android.mk"
    }
  }
Run Code Online (Sandbox Code Playgroud)

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

  • NDK建造.我解决了我的问题.由于重构了接口java类,jni export functio名称与包名称不匹配.非常感谢. (4认同)