Реализация не найдена

У меня есть приложение для Android, которое должно ссылаться и использовать собственный код C++. Я опытный Java-разработчик, но мне не хватает C++. Я изо всех сил пытаюсь заставить его работать. Я получаю сообщение об ошибке ниже. Если я изменю имя внутри loadLibrary, он немедленно выйдет из строя, поэтому я предполагаю, что загрузка работает нормально. Как я могу это исправить?

No implementation found for boolean com.example.myapplication.BamBridge.test() (tried Java_com_example_myapplication_BamBridge_test and Java_com_example_myapplication_BamBridge_test__)


public class BamBridge implements IBamBridge {

    static {
        System.loadLibrary("native-lib");
    }

    private native boolean test();
}

БАМ.ч:

#ifndef BAM_H
#define BAM_H
#define JNIIMPORT
#define JNIEXPORT  __attribute__ ((visibility ("default")))
#define JNICALL
#include <set>
#include <vector>
#include <string>



extern "C" JNIEXPORT JNICALL bool test();

#endif

BAM.cpp

#include <cstdio>
#include <stdint.h>
#include <iostream>
#include <map>
#include "BAM.h"

#define SWAP_UINT16(val)  ((val << 8) | (val >> 8))






JNIEXPORT JNICALL    bool test()
{
     return true;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.6.0)



add_library( # Specifies the name of the library.
             native-lib

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             src/main/cpp/BAM.cpp )

Я думаю, вы действительно имели в виду extern "C"...

Some programmer dude 25.07.2019 07:29

Переход на «C» приводит к ошибке компиляции: ошибка: объявление «теста» имеет другую языковую привязку

Darthg8r 25.07.2019 07:33

Вам нужно extern "C" в файле заголовок (и убедитесь, что файл заголовка включен во все соответствующие исходные файлы, включая тот, где вы определяете функцию).

Some programmer dude 25.07.2019 07:35

@Someprogrammerdude Это приводит к той же проблеме. Я обновил вопрос, чтобы отразить ваши комментарии.

Darthg8r 25.07.2019 07:39

Ваша функция C++ не имеет ожидаемого имени (Java_com_example_myapplication_BamBridge_test) и поэтому не найдена.

Michael 25.07.2019 07:51

Ха, вот и все. Есть ли способ предоставить подсказки стороне Java, чтобы нам не приходилось менять имена функций библиотеки cpp? Сделайте это своим ответом, и я приму...

Darthg8r 25.07.2019 07:54

@ Darthg8r Нет, вы ДОЛЖНЫ изменить сторону C. Вы можете указать на стороне C другое сопоставление имен. Но это гигантская головная боль, проще использовать правильный формат.

Gabe Sechan 25.07.2019 07:55
3
7
426
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На стороне C измените имя вашей функции на

Java_com_example_myapplication_BamBridge_test

Поскольку java ищет функцию в определенном формате.

В вашем заголовочном файле:

extern "C" 
{
    JNIEXPORT jboolean JNICALL Java_com_example_myapplication_BamBridge_test(JNIEnv *, jobject);
}

В вашем файле CPP:

extern "C"
{
    jboolean Java_com_example_myapplication_BamBridge_test(JNIEnv * env, jobject this)
    {
        return true;
    }
}

Другие вопросы по теме