JNI: ошибка java.lang.UnsatisfiedLinkError - PullRequest
1 голос
/ 15 февраля 2012

У меня есть некоторые проблемы при попытке заставить работать JNI. У меня есть приложение на C ++, и я хочу вызывать методы из этого приложения в моей Java-программе. Я написал свою Java-программу, вызывающую нативные методы, а затем использовал javah для генерации заголовочного файла. Как только моя тестовая программа на C ++ скомпилирована в библиотеку .so, я вызываю эту библиотеку из моей Java-программы. Загрузка System.loadLibrary в порядке, но, похоже, он не может найти в ней методы. Я получаю:

Exception in thread "main" java.lang.UnsatisfiedLinkError: ApiPackets.get_lost_packets()V
    at ApiPackets.get_lost_packets(Native Method)
    at ApiPackets.main(ApiPackets.java:12)

Вот мой Java, вызывающий нативные методы:

public class ApiPackets {

    public native void get_lost_packets();
    public native int get_late_packets();
    public native int get_out_of_order_packets();

    static { System.loadLibrary("ApiPackets");}

    public static void main(String[] args) {
        ApiPackets api = new ApiPackets();
        System.out.println("pass");
        api.get_lost_packets();
}
}

А вот мой C ++, затем скомпилированный в libApiPackets.so:

#include "ApiPackets.h"
#include <stdio.h>
#include "main_window.h"

JNIEXPORT void JNICALL Java_ApiPackets_get_lost_packets
  (JNIEnv * env, jobject obj) {
    printf("coucou");
    return;
}

JNIEXPORT jdouble JNICALL Java_ApiPackets_get_1late_1packets
  (JNIEnv * env, jobject obj) {
    jdouble late = mw->priv->current_call->get_late_packets ();
    return late;
}

JNIEXPORT jdouble JNICALL Java_ApiPackets_get_1out_1of_1order_1packets
  (JNIEnv * env, jobject obj) {
    jdouble out_of_order = mw->priv->current_call->get_out_of_order_packets ();
    return out_of_order;
}

1 Ответ

1 голос
/ 15 февраля 2012

Функции C ++ должны быть объявлены extern "C". (Макрос JNI JNIEXPORT не делает этого, так как он предназначен для использования в обоих C и C ++.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...