搜索
首页Java找不到已编译的c++库函数

php小编柚子在编写C++程序时,有时可能会遇到“找不到已编译的C++库函数”的问题。这个错误通常发生在链接阶段,意味着编译器无法找到所需的库函数。造成这个问题的原因可能有多种,比如库文件路径配置错误、库文件未正确安装等。为了解决这个问题,我们可以通过检查库文件路径、重新安装库文件以及更新编译器等方法来修复。在本文中,我们将详细介绍如何解决这个常见的编译错误。

问题内容

我有一个名为 libmylibrary.a 的文件和一个名为 mylibrary.h 的头文件 其中包含一个名为 myfunction() 的函数。我将它们与 cpp 文件 (helloworldjni.cpp) 结合起来,创建了一个名为 native.dll 的新库。但是,当我尝试使用 jni 在 java 中编译 native.dll 时,我无法找到 libmylibrary.a 和 mylibrary.h 中的函数。

mylibrary.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

这些是我遵循的步骤

1.创建用于集成jni的java文件(helloworldjni.java)

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.使用此命令创建了 helloworldjni.h 文件

javac -h .  helloworldjni.java

3.将mylibrary.h文件和helloworldjni.h文件与我的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.编译这些文件(创建.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.生成.o文件到.dll文件

g++ -shared -o native.dll helloworldjni.o

6.编译并运行helloworldjni.java

java helloworldjni

收到此错误:

java: symbol lookup error: /home/centos/test5/native.dll: undefined symbol: myFunction

如何将 libmylibrary.a 合并到我的 java 代码编译中,以确保它能够识别 libmylibrary.a 中的函数?

ps:我确信 libmylibrary.a 没有问题,因为我能够使用纯 c++ 调用 myfunction() 但在使用 jni 时似乎存在某种我无法弄清楚的链接问题

解决方法

我尝试了您的所有步骤并进行了一些细微的更改,这对我有用。附加构建脚本:

#!/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


但有一些注意事项:

  1. 在 windows 上,您很可能必须设置一些宏,因此 jniexport 实际上是 __declspec(dllexport),而不是 __declspec(dllimport)
  2. 要在 linux 上链接 *.so 文件,您需要使用 -fpic 编译 c++ 文件

以上是找不到已编译的c++库函数的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:stackoverflow。如有侵权,请联系admin@php.cn删除

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
4 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
4 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
4 周前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
1 个月前By尊渡假赌尊渡假赌尊渡假赌

热工具

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中