Android Studio JNI with C ++ UnsatisfiedLinkError

时间:2016-08-19 14:58:44

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

我正在使用Android Studio 2.1.2我没有使用实验插件

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

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

build.gradle from Module

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个文件位于主

的jni文件夹中

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := mylib
LOCAL_SRC_FILES := HelloJni.cpp

include $(BUILD_SHARED_LIBRARY)

Application.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!");
 }

Header.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上搜索了很多,但我没有得到我错过的东西?

现在没有错误,修正了以上错误。请检查我对这个问题的回答。

2 个答案:

答案 0 :(得分:1)

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

LOCAL_SOURCE_FILE := HelloJni.cpp

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

LOCAL_SRC_FILES := HelloJni.cpp

答案 1 :(得分:0)

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

android.useDeprecatedNdk =真

因此它与Android Studio版本2.1.2相关,对于此版本的实验插件是默认选项,我不推荐使用我正在使用的方法。 我很快就会尝试使用实验插件。