Android Studio JNI с C ++ UnsatisfiedLinkError

Я использую Android Studio 2.1.2 Я не использую экспериментальный плагин

Пожалуйста, проверьте следующие файлы и проверьте ошибку, которую я получаю.

Я решил проблему. Отредактированный файл выглядит следующим образом. То, как я это исправил, может быть не правильным, так как я устанавливаю свойство устаревшим способом, но это работает. Экспериментальный плагин все еще может быть нестабильным. Я скоро попробую с экспериментальным плагином.

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 файла находятся в папке 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

Я также установил путь NDK в Структуре проекта и в переменной среды Path.

Я получаю следующую ошибку

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, но не понимаю, что пропустил?

Нет ошибок сейчас, ошибка выше исправлена. Пожалуйста, проверьте мой ответ на этот вопрос.

0

Решение

Я думаю, что проблема в вашем файле Android.mk:

LOCAL_SOURCE_FILE := HelloJni.cpp

AFAIK система сборки Android не использует переменную с таким именем. Так должно быть:

LOCAL_SRC_FILES := HelloJni.cpp
1

Другие решения

Одно важное изменение, которое я сделал, находится в файле gradle.properties:

android.useDeprecatedNdk = верно

поэтому он относится к Android Studio версии 2.1.2, для этой версии экспериментальный плагин является опцией по умолчанию, а подход, который я использую, устарел.
Я скоро попробую с экспериментальным плагином.

0

По вопросам рекламы [email protected]