Создать общую библиотеку с WiringPI
Я хочу создать общую библиотеку, потому что это нужно для JNI.
У меня есть два файла
PiezoSpeaker.c
#include "PiezoSpeaker.h"
#include <stdio.h>
#include <string.h>
#include <wiringPi.h>
#include <softTone.h>
JNIEXPORT void JNICALL Java_PiezoSpeaker_tone__I
(JNIEnv *env, jobject jobject, jint khz) {
wiringPiSetup();
softToneCreate(29);
softToneWrite (29, khz);
}
JNIEXPORT void JNICALL Java_PiezoSpeaker_tone__II
(JNIEnv *env, jobject jobject, jint khz, jint duration) {
}
а также
PiezoSpeaker.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class PiezoSpeaker */
#ifndef _Included_PiezoSpeaker
#define _Included_PiezoSpeaker
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: PiezoSpeaker
* Method: tone
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_PiezoSpeaker_tone__I
(JNIEnv *, jobject, jint);
/*
* Class: PiezoSpeaker
* Method: tone
* Signature: (II)V
*/
JNIEXPORT void JNICALL Java_PiezoSpeaker_tone__II
(JNIEnv *, jobject, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
Я собираю это с GCC
gcc -c -fPIC -I"/usr/lib/jvm/jdk-8-oracle-arm32-vfp-hflt/include/" -I"/usr/lib/jvm/jdk-8-oracle-arm32-vfp-hflt/include/linux" -IwiringPi -Ipthread PiezoSpeaker.c
gcc -shared -o share.so PiezoSpeaker.o
Я становлюсь ошибкой, что символ не определен. Команда gcc неверна, потому что она не включает библиотеку wiringPi. Как я могу связать библиотеку, что WiringPi Lib включен?
0 ответов
В зависимости от версии WiringPi, которую вы используете, и от того, как вы ее создали и установили, вызов может измениться. Предполагая, что вы используете Rasberry Pi с WiringPi - github (не устаревшую версию, а неофициальное зеркало), и вы клонировали репозиторий локально в свой Rasberry Pi.
cd WiringPi
./build
# add /usr/local/lib to /etc/ld.so.conf
sudo ldconfig
Выше взят из WiringPi INSTALL
Тогда для вашей строки компиляции вам понадобится
gcc -c -fPIC -I"/usr/lib/jvm/jdk-8-oracle-arm32-vfp-hflt/include/" -I"/usr/lib/jvm/jdk-8-oracle-arm32-vfp-hflt/include/linux" -lwiringPi -pthread -lrt -lm PiezoSpeaker.c
- -lwiringPi - дает вам wiringPi
- -lrt и -lm - позаботиться о привязке к зависимостям внутри самого wiringPi