Maison > Java > le corps du texte

Fonction de bibliothèque C++ compilée introuvable

WBOY
Libérer: 2024-02-08 23:57:19
avant
924 Les gens l'ont consulté

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.

Contenu de la question

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
Copier après la connexion

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();
}
Copier après la connexion

2. Utilisez cette commande pour créer le fichier helloworldjni.h

javac -h .  helloworldjni.java
Copier après la connexion

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();
}
Copier après la connexion

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
Copier après la connexion

5. Générez un fichier .o en fichier .dll

g++ -shared -o native.dll helloworldjni.o
Copier après la connexion

6. Compilez et exécutez helloworldjni.java

java helloworldjni
Copier après la connexion

J'ai reçu cette erreur :

java: symbol lookup error: /home/centos/test5/native.dll: undefined symbol: myFunction
Copier après la connexion

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

Solution de contournement

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


Copier après la connexion

Mais il y a quelques mises en garde :

  1. Sous Windows, vous devrez probablement configurer quelques macros, donc jniexport 实际上是 __declspec(dllexport),而不是 __declspec(dllimport)
  2. Pour créer un lien sous Linux *.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!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal