Nano Hash - криптовалюты, майнинг, программирование

Собственный метод не найден: Package.methodName:()Ljava/lang/String;

У меня проблемы с разработкой Android ndk. Я очень новичок в ndk и следую учебнику. Во время компиляции ошибок не возникает, но когда я загружаю приложение на устройство, оно выдает ошибку, что Native Method Not Found. Я приложил код и снимки моей посылки.

В ndk-build у меня получилось вот что:

[arm64-v8a] Compile        : com_testing_ndk_FibLib <= com_testing_ndk_FibLib.c
[arm64-v8a] SharedLibrary  : libcom_testing_ndk_FibLib.so
[arm64-v8a] Install        : libcom_testing_ndk_FibLib.so => libs/arm64-v8a/libcom_testing_ndk_FibLib.so
[x86_64] Compile        : com_testing_ndk_FibLib <= com_testing_ndk_FibLib.c
[x86_64] SharedLibrary  : libcom_testing_ndk_FibLib.so
[x86_64] Install        : libcom_testing_ndk_FibLib.so => libs/x86_64/libcom_testing_ndk_FibLib.so
[mips64] Compile        : com_testing_ndk_FibLib <= com_testing_ndk_FibLib.c
[mips64] SharedLibrary  : libcom_testing_ndk_FibLib.so
[mips64] Install        : libcom_testing_ndk_FibLib.so => libs/mips64/libcom_testing_ndk_FibLib.so
[armeabi-v7a] Compile thumb  : com_testing_ndk_FibLib <= com_testing_ndk_FibLib.c
[armeabi-v7a] SharedLibrary  : libcom_testing_ndk_FibLib.so
[armeabi-v7a] Install        : libcom_testing_ndk_FibLib.so => libs/armeabi-v7a/libcom_testing_ndk_FibLib.so
[armeabi] Compile thumb  : com_testing_ndk_FibLib <= com_testing_ndk_FibLib.c
[armeabi] SharedLibrary  : libcom_testing_ndk_FibLib.so
[armeabi] Install        : libcom_testing_ndk_FibLib.so => libs/armeabi/libcom_testing_ndk_FibLib.so
[x86] Compile        : com_testing_ndk_FibLib <= com_testing_ndk_FibLib.c
[x86] SharedLibrary  : libcom_testing_ndk_FibLib.so
[x86] Install        : libcom_testing_ndk_FibLib.so => libs/x86/libcom_testing_ndk_FibLib.so
[mips] Compile        : com_testing_ndk_FibLib <= com_testing_ndk_FibLib.c
[mips] SharedLibrary  : libcom_testing_ndk_FibLib.so
[mips] Install        : libcom_testing_ndk_FibLib.so => libs/mips/libcom_testing_ndk_FibLib.so

FibLib.java

 package com.testing.ndk;

public class FibLib {
       static {
          System.loadLibrary("com_testing_ndk_FibLib"); // Load native library at runtime
                                       // hello.dll (Windows) or libhello.so (Unixes)
       }

       // Declare a native method sayHello() that receives nothing and returns void
       public static native String sayHello();

       // Test Driver
       public static void main(String[] args) {
          new FibLib().sayHello();  // invoke the native method
       }
    }

com_testing_ndk_FibLib.c

  #include <jni.h>
#include <stdio.h>
#include "com_testing_ndk_FibLib.h"
// Implementation of native method sayHello() of HelloJNI class

   JNIEXPORT void JNICALL Java_com_testing_ndk_FibLib_sayHello(JNIEnv *env, jobject thisObj) {
   printf("Hello World!\n");
   return;
}

com_testing_ndk_FibLib.h

    /* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_testing_ndk_FibLib */

#ifndef _Included_com_testing_ndk_FibLib
#define _Included_com_testing_ndk_FibLib
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_testing_ndk_FibLib
 * Method:    sayHello
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_testing_ndk_FibLib_sayHello
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

Application.mk

APP_PLATFORM := android-17
APP_ABI :=all

Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES :=com_testing_ndk_FibLib.c
LOCAL_MODULE :=com_testing_ndk_FibLib
include $(BUILD_SHARED_LIBRARY) 

Журнал ошибок:

[arm64-v8a] Compile        : com_testing_ndk_FibLib <= com_testing_ndk_FibLib.c
jni/com_testing_ndk_FibLib.c:6:24: error: conflicting types for 'Java_com_testing_ndk_FibLib_sayHello'
 JNIEXPORT void JNICALL Java_com_testing_ndk_FibLib_sayHello(JNIEnv *env, jobject thisObj) {
                        ^
In file included from jni/com_testing_ndk_FibLib.c:3:0:
jni/com_testing_ndk_FibLib.h:15:27: note: previous declaration of 'Java_com_testing_ndk_FibLib_sayHello' was here
 JNIEXPORT jstring JNICALL Java_com_testing_ndk_FibLib_sayHello
                           ^
make: *** [obj/local/arm64-v8a/objs/com_testing_ndk_FibLib/com_testing_ndk_FibLib.o] Error 1

введите здесь описание изображения

11.05.2015

  • Очевидно - метод не найден, потому что вы не реализовали метод с сигнатурой JNIEXPORT jstring JNICALL Java_com_testing_ndk_FibLib_sayHello (JNIEnv *, jclass), как это предлагается в заголовочном файле. 11.05.2015
  • @Валентин, спасибо за ответ. Не могли бы вы исправить фрагмент кода здесь с вашим кодом, это мне очень поможет 11.05.2015
  • Та же проблема, что и у stackoverflow.com/questions/30152520/ ? 11.05.2015

Ответы:


1

JNI выполняет собственный поиск метода, используя его имя. Чтобы убедиться, что найденная им экспортируемая функция верна, методы должны быть названы по следующей схеме:

Java_package_name_className_methodName

Например, в вашем случае имя нативной функции должно быть Java_com_testing_ndk_FibLib_sayHello, а в вашем com_testing_ndk_FibLib.c функции с таким именем нет.

Следующий фрагмент должен подойти, если вы поместите его в этот файл.

com_testing_ndk_FibLib.c

#include <jni.h>
#include <stdio.h>
#include "com_testing_ndk_FibLib.h"

// Implementation of native method sayHello() of HelloJNI class
JNIEXPORT void JNICALL Java_com_testing_ndk_FibLib_sayHello(JNIEnv *env, jobject thisObj) {
   printf("Hello World!\n");
   return;
}


Чтобы устранить проблему, измените возвращаемый тип подписи в com_testing_ndk_FibLib.h в строке 15.

...
JNIEXPORT void JNICALL Java_com_testing_ndk_FibLib_sayHello
  (JNIEnv *, jclass);
...

и в FibLib.java в строке 10:

...
public static native String sayHello();
...

Прочитайте о JNI здесь: http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html

11.05.2015
  • Спасибо за ваш ответ. Делая это, я получаю следующую ошибку, пожалуйста, смотрите мой обновленный журнал ошибок выше 11.05.2015
  • Хорошо, почему вы объявили sayHello() (в java) для возврата объекта String, даже если он ничего не возвращает? Измените тип возвращаемого значения на void и снова создайте заголовочный файл. 11.05.2015
  • не могли бы вы дать мне здесь фрагмент кода. я тут запутался 11.05.2015
  • я отредактировал ответ и добавил решение и ссылку на спецификацию JNI 11.05.2015
  • Я отредактировал все мои вышеприведенные коды в соответствии с вашей инструкцией, но все равно получаю ту же ошибку. Пожалуйста, направьте меня сюда. 12.05.2015
  • Благодарю. Это решило. Я делал ошибку в названии метода 12.05.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..