У меня есть приложение для 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 )
Переход на «C» приводит к ошибке компиляции: ошибка: объявление «теста» имеет другую языковую привязку
Вам нужно extern "C" в файле заголовок (и убедитесь, что файл заголовка включен во все соответствующие исходные файлы, включая тот, где вы определяете функцию).
@Someprogrammerdude Это приводит к той же проблеме. Я обновил вопрос, чтобы отразить ваши комментарии.
Ваша функция C++ не имеет ожидаемого имени (Java_com_example_myapplication_BamBridge_test) и поэтому не найдена.
Ха, вот и все. Есть ли способ предоставить подсказки стороне Java, чтобы нам не приходилось менять имена функций библиотеки cpp? Сделайте это своим ответом, и я приму...
@ Darthg8r Нет, вы ДОЛЖНЫ изменить сторону C. Вы можете указать на стороне C другое сопоставление имен. Но это гигантская головная боль, проще использовать правильный формат.
На стороне 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;
}
}
Я думаю, вы действительно имели в виду
extern "C"...