Lorsque l'éditeur php Youzi écrit un programme C++, il peut parfois rencontrer le problème de "impossible de trouver la fonction de bibliothèque C++ compilée". Cette erreur se produit généralement pendant la phase de liaison et signifie que le compilateur ne trouve pas la fonction de bibliothèque requise. Ce problème peut avoir plusieurs raisons, telles qu'une configuration incorrecte du chemin du fichier de bibliothèque, une mauvaise installation du fichier de bibliothèque, etc. Afin de résoudre ce problème, nous pouvons le résoudre en vérifiant le chemin du fichier de bibliothèque, en réinstallant le fichier de bibliothèque et en mettant à jour le compilateur. Dans cet article, nous détaillerons comment corriger cette erreur de compilation courante.
J'ai un fichier nommé libmylibrary.a et un fichier d'en-tête nommé mylibrary.h qui contient une fonction nommée myfunction(). Je les ai combinés avec le fichier cpp (helloworldjni.cpp) et créé une nouvelle bibliothèque appelée native.dll. Cependant, lorsque j'essaie de compiler native.dll en Java à l'aide de jni, je ne trouve pas les fonctions dans libmylibrary.a et mylibrary.h.
malibrary.h
// mylibrary.h #ifndef mylibrary_h #define mylibrary_h #ifdef __cplusplus extern "c" { #endif void myfunction(); // declare the function prototype #ifdef __cplusplus } #endif #endif // mylibrary_h
Voici les étapes que j'ai suivies
1. Créez un fichier java (helloworldjni.java) pour intégrer jni
public class helloworldjni { static { system.load("/home/centos/test5/native.dll"); } public static void main(string[] args) { new helloworldjni().sayhello(); } //native method with no body public native void sayhello(); }
2. Utilisez cette commande pour créer le fichier helloworldjni.h
javac -h . helloworldjni.java
3. Intégrez le fichier mylibrary.h et le fichier helloworldjni.h avec mon fichier cpp (helloworldjni.cpp)
#include<iostream> #include<jni.h> #include "mylibrary.h" #include "helloworldjni.h" void sayhello(){ myfunction(); } int main() { sayhello(); // call the function from the library return 0; } jniexport void jnicall java_helloworldjni_sayhello (jnienv* env, jobject thisobject) { sayhello(); }
4. Compilez ces fichiers (créez des fichiers .o)
g++ helloworldjni.cpp -l. -lmylibrary -i"/home/centos/jdk-21.0.1/include" -i"/home/centos/jdk-21.0.1/include/linux" -o helloworldjni.o
5. Générez un fichier .o en fichier .dll
g++ -shared -o native.dll helloworldjni.o
6. Compilez et exécutez helloworldjni.java
java helloworldjni
J'ai reçu cette erreur :
java: symbol lookup error: /home/centos/test5/native.dll: undefined symbol: myFunction
Comment puis-je incorporer libmylibrary.a dans ma compilation de code Java pour m'assurer qu'il reconnaît les fonctions de libmylibrary.a ?
ps : je suis sûr qu'il n'y a pas de problème avec libmylibrary.a car je peux appeler myfunction() en utilisant du C++ pur mais il semble y avoir une sorte de problème de liaison lors de l'utilisation de jni que je n'arrive pas à comprendre
J'ai essayé toutes vos étapes et apporté quelques légères modifications et cela a fonctionné pour moi. Script de build supplémentaire :
#!/bin/sh JAVA_SDK_HOME=/home/user/lib/jdk-21.0.1 #echo BUILD THE LIB #g++ -c mylibrary.cpp -o mylibrary.o #ar rcs libmylibrary.a mylibrary.o echo MAKE JAVA STUB $JAVA_SDK_HOME/bin/javac -h . HelloWorldJNI.java echo BUILD SO file g++ -c -fPIC -o HelloWorldJNI.o HelloWorldJNI.cpp \ -I $JAVA_SDK_HOME/include/ \ -I $JAVA_SDK_HOME/include/linux g++ -shared -o native.dll HelloWorldJNI.o -L. -lmylibrary echo TESTING $JAVA_SDK_HOME/bin/java HelloWorldJNI
Mais il y a quelques mises en garde :
jniexport
实际上是 __declspec(dllexport)
,而不是 __declspec(dllimport)
*.so
文件,您需要使用 -fpic
compiler des fichiers C++Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!