栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在Linux上为JNI应用程序编译动态库?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在Linux上为JNI应用程序编译动态库?

可以通过loadLibrary使用有效名称加载本机库。例如,对于Linux家族的lib XXXX
.so,您的hellolib.so应该重命名为libhello.so。顺便说一下,我使用jni开发Java,我将实现和本地接口(.c或.cpp)分开。

static {    System.loadLibrary("hello"); // will load libhello.so}

实现标头(HelloImpl.h):

#ifndef _HELLO_IMPL_H#define _HELLO_IMPL_H#ifdef __cplusplus        extern "C" {#endif        void sayHello ();#ifdef __cplusplus        }#endif#endif

HelloImpl.cpp:

#include "HelloImpl.h"#include  <iostream>using namespace std;void sayHello () {    cout << "Hello World!" << endl;    return;}

Hello.c(我更喜欢在c中编译jni):

#include <jni.h>#include "Hello.h"#include "HelloImpl.h"JNIEXPORT void JNICALL Java_Hello_sayHello (JNIEnv *env, jobject obj) {    sayHello();    return;}

最后,我们可以按以下步骤进行编译:

  1. 编译obj(生成HelloImpl.o)

g ++ -c -I“ / opt / java / include” -I“ / opt / java / include / linux”
HelloImpl.cpp

  1. 用.o编译jni

g ++ -I“ / opt / java / include” -I“ / opt / java / include / linux” -o
libhello.so -shared -Wl,-soname,hello.so Hello.c HelloImpl.o -static -lc

在第2步中,我们使用g ++进行编译。这个非常重要。您可以看到如何混合使用C和C
++

编译后,可以检查使用nm命名的函数:

$ nm libhello.so |grep say00000708 T Java_Hello_sayHello00000784 t _GLOBAL__I_sayHello00000718 T sayHello

有一个标记为T的Java_Hello_sayHello。它应完全等于您的本机方法名称。如果一切正常。您可以运行它:

$ java -Djava.library.path=. HelloHello World!


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/405574.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号