【问题标题】:Android Studio JNI with C++ UnsatisfiedLinkError带有 C++ UnsatisfiedLinkError 的 Android Studio JNI
【发布时间】:2016-08-19 14:58:43
【问题描述】:

我使用的是 Android Studio 2.1.2 我没有使用 Experimental Plugin

请检查以下文件并检查我收到的错误。

我解决了这个问题。编辑后的文件如下。我修复它的方式可能不是正确的方式,因为我将属性设置为使用不推荐使用的方式,但它可以工作。实验性插件仍然可能不稳定。我很快就会尝试使用实验性插件。

来自模块的build.gradle

sourceSets.main {
        jniLibs.srcDir 'src/main/libs'
        /*jni.srcDirs = [] not using this, I commented this. Please check SO links which explained when to use this and when not to use this*/
    }

以下 4 个文件位于 main 的 jni 文件夹中

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := mylib
LOCAL_SRC_FILES := HelloJni.cpp

include $(BUILD_SHARED_LIBRARY)

应用程序.mk

APP_ABI := all

HelloJni.cpp

#include <jni.h>
#include <Header.h>

 JNIEXPORT jstring JNICALL Java_com_example_m1035325_ndksampleapp_MainActivity_getStringFromJni(JNIEnv *env,jobject thiz)
 {
 env-> NewStringUTF ( "Hellofrom JNI!");
 }

头文件.h

#include <jni.h>;
using namespace std;

#ifndef HEADER
#define HEADER

extern "C" {
JNIEXPORT jstring JNICALL Java_com_example_m1035325_ndksampleapp_MainActivity_getStringFromJni(JNIEnv *env, jobject obj);
}

#endif //NDKSAMPLEAPP_HEADER_H

MainActicity.java

static
    {
        System.loadLibrary("mylib");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView tvHello=(TextView)findViewById(R.id.tvHello);
        tvHello.setText(getStringFromJni());
    }

    public native String getStringFromJni();

当我将鼠标悬停在方法 getStringFromJni 上时,它显示无法解析相应的 JNI 函数

我已经在 Project Structure 和 Path 环境变量中设置了 NDK 路径。

我收到以下错误

Process: com.example.m1035325.ndksampleapp, PID: 12831
                                                                                   java.lang.UnsatisfiedLinkError: No implementation found for java.lang.String com.example.m1035325.ndksampleapp.MainActivity.getStringFromJni() (tried Java_com_example_m1035325_ndksampleapp_MainActivity_getStringFromJni and Java_com_example_m1035325_ndksampleapp_MainActivity_getStringFromJni__)
                                                                                       at com.example.m1035325.ndksampleapp.MainActivity.getStringFromJni(Native Method)

我也在 SO 上进行了很多搜索,但没有得到我错过的内容?

现在没有错误,上述错误已修复。请检查我对这个问题的回答。

【问题讨论】:

  • 您缺少JNICALL,签名应以JNIEXPORT jstring JNICALL开头,
  • 感谢您的意见。是的,你是对的。我将它添加到我的文件中。请检查我上面编辑的文件。

标签: android c++ android-studio android-ndk java-native-interface


【解决方案1】:

我认为问题出在您的 Android.mk 文件中:

LOCAL_SOURCE_FILE := HelloJni.cpp

AFAIK Android 构建系统不使用该名称的变量。应该是:

LOCAL_SRC_FILES := HelloJni.cpp

【讨论】:

  • 感谢您的意见。我做了这个更改,现在在 ndk-build 上我的 cpp 文件正在编译。然后在我修复了我的 CPP 文件中的一些错误之后,例如 NewStringUTF 函数调用等,生成了 ndk-build .so 但仍然在运行应用程序我得到了相同的“不满意的链接错误”。一件事是在我的 MainActivity 类中,当我将鼠标悬停在本机方法上时,它显示我无法解析相应的 JNI 函数。你能帮我解决这个问题吗?
  • 我在 MainActivity.java.. Android UI 文件中是否缺少任何导入?
【解决方案2】:

我做的一个重要改动是在文件 gradle.properties 中,如下

android.useDeprecatedNdk=true

所以它与 Android Studio 版本 2.1.2 相关,对于这个版本,实验性插件是默认使用的选项,我使用的方法已被弃用。 我很快就会尝试使用实验性插件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    相关资源
    最近更新 更多