Ubuntu下,Java中利用JNI调用codeblocks c++生成的动态库的使用步骤

2023-11-19

1、  打开新立得包管理器,搜索JDK,选择openjdk-6-jdk安装;

2、  打开Ubuntu软件中心,搜索Eclipse,选择Eclipse集成开发环境,安装;

3、  打开EclipseFile-->New-->Java Project-->Project name:TestJavaJNI-->next-->Finish,选中TestJavaJNI,点击右键-->new-->Class,Name:TestJNI-->Finish,编写Java类;

public class TestJNI

{

public native int add(int a, int b);

public native String upperCase(String str);

static

{

           System.loadLibrary("JniDll");

}

public static void main(String[] args)

{

           TestJNI test = new TestJNI();

 

           int a=10, b=20, result; 

           result = test.add(a, b);

          

           System.out.println("两者的和为: " + result);

          

           String str1, str2;

         

           str1 = "abcDEFhijk";

          

           str2 = test.upperCase(str1);

          

           System.out.println(str2);

}

}

4、  打开终端,进入到TestJNI.java所在目录下,执行 javac TestJNI.java命令,编译完成后生成TestJNI.class文件;

5、  执行Javah TestJNI命令,生成TestJNI.h头文件;

6、  打开Code::Blocksfile-->new-->Projects-->选中Shared library,-->Go-->next-->c++,Next-->Project title:JniDll-->next-->Finish,生成一个main.cpp文件;

#include "TestJNI.h"

#include <iostream>

#include <cstring>

#include <stdlib.h>

 

 

using namespace std;

 

extern "C"

{

    char* jstringToNative(JNIEnv *env, jstring jstr)

    {

        if (env->ExceptionCheck() == JNI_TRUE || jstr == NULL)

        {

            env->ExceptionDescribe();

            env->ExceptionClear();

            printf("jstringToNative函数转换时,传入的参数jstr为空");

 

            return NULL;

        }

 

        jbyteArray bytes = 0;

        jthrowable exc;

        char *result = 0;

 

        if (env->EnsureLocalCapacity(2) < 0)

        {

            return 0; /* out of memory error */

        }

 

        jclass jcls_str = env->FindClass("java/lang/String");

        jmethodID MID_String_getBytes = env->GetMethodID(jcls_str, "getBytes", "()[B");

 

        bytes = (jbyteArray)env->CallObjectMethod(jstr, MID_String_getBytes);

        exc = env->ExceptionOccurred();

 

        if (!exc)

        {

            jint len = env->GetArrayLength( bytes);

            result = (char *)malloc(len + 1);

 

            if (result == 0)

            {

                //JNU_ThrowByName(env, "java/lang/OutOfMemoryError",    0);

                env->DeleteLocalRef(bytes);

 

                return 0;

            }

 

            env->GetByteArrayRegion(bytes, 0, len, (jbyte *)result);

            result[len] = 0; /* NULL-terminate */

        }

        else

        {

            env->DeleteLocalRef(exc);

        }

 

        env->DeleteLocalRef(bytes);

 

        return (char*)result;

    }

 

    jstring nativeTojstring( JNIEnv* env,const char* str )

    {

        jclass strClass = env->FindClass( "Ljava/lang/String;");

        jmethodID ctorID = env->GetMethodID( strClass, "<init>",

                                             "([BLjava/lang/String;)V");

 

        if (env->ExceptionCheck() == JNI_TRUE || str == NULL)

        {

            env->ExceptionDescribe();

            env->ExceptionClear();

            printf("nativeTojstring函数转换时,str为空\n");

 

            return NULL;

        }

 

        jbyteArray bytes = env->NewByteArray( strlen(str));

        //如果str为空则抛出异常给jvm

 

        env->SetByteArrayRegion( bytes, 0,  strlen(str), (jbyte*)str);

        //jstring encoding = env->NewStringUTF( "GBK");

        jstring encoding = env->NewStringUTF( "UTF8");

        jstring strRtn = (jstring)env->NewObject( strClass, ctorID, bytes,

                         encoding);

        //释放str内存

        // free(str);

        return strRtn;

    }

 

    char* strupr(char *str)

    {

        char *p = str;

 

        while (*p != '\0')

        {

            if (*p >= 'a' && *p <= 'z')

            {

                *p -= 0x20;

            }

            p++;

        }

        return str;

    }

 

    JNIEXPORT jint JNICALL Java_TestJNI_add(JNIEnv *env, jobject, jint a, jint b)

    {

        int result = (int)(a + b);

 

        return (jint)result;

    }

 

    JNIEXPORT jstring JNICALL Java_TestJNI_upperCase(JNIEnv *env, jobject, jstring str)

    {

        string strUpper;

 

        strUpper = (string)jstringToNative(env,str);

 

        strUpper = (string)strupr((char *)strUpper.c_str());

 

        jstring strResult = nativeTojstring(env, strUpper.c_str());

 

        return strResult;

    }

}

7、  将TestJNI.h头文件复制到main.cpp目录,并添加到工程中,分别在ReleaseDebug下,Projectàbuild optionsàSearch directoriesàCompileràAdd:

../../../../../usr/lib/jvm/java-6-openjdk/include/linux

../../../../../usr/lib/jvm/java-6-openjdk/include

         Project-->build options-->compiler settings-->Other options加入-fPIC;编译生成libJniDll.so;

8、  使用sudo cp命令将libJniDll.so(ReleaseDebug)拷贝到/usr/lib目录下;

9、  在Eclipce中运行TestJNI.java或在终端运行java TestJNI,运行结果:

两者的和为: 30

ABCDEFHIJK

 

参考文献:

1、  http://blog.sina.com.cn/s/blog_6a6b58ce0100oiip.html

2、  http://blog.csdn.net/lee353086/article/details/6160576

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ubuntu下,Java中利用JNI调用codeblocks c++生成的动态库的使用步骤 的相关文章

  • Linkify 是否适用于 Android 中的 TextView?

    我有这段代码适用于调用 EditText 的方法 我尝试对 TextView 使用相同的代码 但它不起作用 文本不会像 EditText 那样变成超链接 有人知道为什么吗 public class MainActivity extends
  • 我是否应该将 CachingConnectionFactory 与 hornetq 2.4.1 一起使用

    根据有关在 hornetq 中使用 JMSTemplate 的长期信息 我们在连接到服务器时一直使用 CachingConnectionFactory 这是一个示例配置 与我们正在使用的配置非常相似
  • 使用 ImageMagick 从文本生成图像?

    我正在尝试使用 ImageMagick 创建 3840 x 2160 的缩略图 我需要图像具有黑色背景和白色文本 文本应垂直和水平居中 我希望能够设置字体大小 但如果文本超出图像 则会自动减小字体大小 使其适合左侧和右侧的一定量的填充 我将
  • Java中如何让另一个线程休眠

    我有一个扩展 Thread 的类 这个线程在运行时大部分时间都在睡眠 它会执行一个检查 如果 true 执行一个简单的操作 然后睡眠 1 2 秒并重复 该类还有一个由其他线程调用的公共方法 如果调用此函数 我希望线程在已经休眠的情况下休眠更
  • Joda-time:今年 ISO 第一周的第一天

    我想找出今年 ISO 第 1 周中星期一的日期 对于 2009 年 这将是 2008 年 12 月 29 日星期一 我确定乔达时间 http www joda org joda time cal iso html可以处理这个问题 但我就是无
  • Java 递增/递减运算符 - 它们的行为方式是什么,功能是什么?

    开始学习Java已经三天了 我有这个程序 但我不明白其中的代码main方法与 and 运营商 我什至不知道该怎么称呼他们 这些操作员的名字 谁能给我解释一下这是怎么回事 class Example public static void ma
  • Python 在打开套接字时可以选择哪个网络适配器吗?

    运行 python 应用程序的目标计算机将具有三个可用的网络接口 一般来说 所有三个网络都会有很大不同 但是三个网络中的两个可能位于相似的网络上 在下面的示例中 我无法控制 ETH 2 上的目标地址 因为它是预先配置的系统 因此我被迫以编程
  • 将 Java 8 Lambda 函数转换为 Java 7

    嘿 我是编码新手 我已经掌握了 Java 8 的 Lambda 函数 但我正在尝试将我为学校项目编写的一些代码转换为 Java 7 但我无法理解关于如何使这段代码在功能上相同 但在 java 7 中 很抱歉 如果这是一个愚蠢的问题 但我似乎
  • 使用 Sheets API v4 获取与 Google 帐户关联的所有电子表格的列表

    使用 Google Sheets API v4 我希望获取附加到我的帐户的电子表格列表 我做了很多研究 但还没有找到任何解决方案 v4 API 不提供列出电子表格的方法 您需要使用 Drive API 这从以前的 API 页面迁移 http
  • 桌面 webkit 相当于 Android 的 addJavascriptInterface()?

    在研究 Android UI 可能性时 我发现了一种名为 addJavascriptInterface 的方法的文档 该方法允许您将 Android Java 对象上的方法公开给 UI 的 WebView 组件中的 Javascript 这
  • java有跳过列表实现吗

    I find ConcurrentSkipListSet http download oracle com javase 6 docs api java util concurrent ConcurrentSkipListSet html在
  • 如何更改Spring-WS的“SOAP-ENV”默认前缀

    我使用 Spring WS 创建了一个 Web 服务 为了保持与旧系统的兼容性 我需要将命名空间前缀从SOAP ENV to soap 我知道SOAP ENV and soap只是命名空间前缀 只要它们引用正确的命名空间 http sche
  • Java正则表达式以数字和固定长度开头的字符串

    我制作了一个正则表达式来检查 String 的长度 所有字符都是数字并以数字开头 例如 123 以下是我的表情 REGEX 123 d 9 但它无法检查字符串的长度 它仅验证那些长度为 9 并以 123 开头的字符串 但如果我传递字符串 1
  • ClassCastException:ApiVersionImpl 无法转换为 java.lang.Integer

    我有 android gradle 项目 当我尝试启动应用程序时出现以下异常 ClassCastException com android build gradle internal model ApiVersionImpl cannot
  • AngularJS 和 Webpack 集成

    我正在寻找一些使用帮助webpack http webpack github io docs 对于大型 AngularJS 应用程序 我们使用基于功能的文件夹结构 每个功能 页面都有一个模块 并且它们有控制器 指令 我已经成功配置了 web
  • 带有 CompletableFuture 的 MDC 记录器

    我正在使用 MDC Logger 除了一种情况外 它对我来说非常适合 无论我们在代码中的何处使用 CompletableFuture 对于创建的线程 MDC 数据都不会传递到下一个线程 因此日志会失败 例如 在代码中我使用下面的代码片段来创
  • “[B”是什么样的 Java 类型?

    我正在尝试通过 Java 代码 Hibernate 从 MySQL DB 获取 MD5 加密密码 但我既得不到 Strong 也得不到任何合理的 Java 类型 我唯一收到的是这条无用的消息 java lang ClassCastExcep
  • Java 中客户端/服务器传输的压缩字符串

    我使用专有的客户端 服务器消息格式来限制我可以通过网络发送的内容 我无法发送序列化对象 我必须将消息中的数据存储为字符串 我发送的数据是大的逗号分隔值 我想在将数据作为字符串打包到消息中之前对其进行压缩 我尝试使用 Deflater Inf
  • JPA:@JoinColumn 和 @PrimaryKeyJoinColumn 之间的区别?

    两者之间的确切区别是什么 JoinColumn and PrimaryKeyJoinColumn You use JoinColumn对于属于外键一部分的列 典型的列可能如下所示 例如 在具有附加属性的连接表中 ManyToOne Join
  • DynamoDBMappingException:HASH 键没有映射

    编写 DynamoDB Java 应用程序时 如果表及其数据模型配置不正确 则在写入表或从表中检索时 您可能会收到 无 HASH 键映射 错误 完整的异常类似于 com amazonaws services dynamodbv2 datam

随机推荐

  • 复杂曲面建模_Rhino 7

    Rhino 和 Sketchup之间的 斗争 已经持续了好长时间 双方基本态度是 呵 你很好用 但我也可以啊 这种争议的底层原因是因为他们无法互通 我们并没有听说过Rhino和Revit有矛盾 也没听说过Sketchup和AutoCAD有什
  • C++系列目录

    基础语言篇 C 数据类型 C位操作 C预编译处理 C指针 C结构体与枚举类型 C 函数 C 虚函数 C 容器与算法 C 类 C I O处理 C 重载操作符与转换 模板与泛型 C C 编译和调试 C C 动态链接 C C 通用MakeFile
  • element表格默认选中

    场景 选中表格多选框后 重新返回这个标签页 已经选择的需要默认选中 但是重新返回后 并没有选中
  • 流计算框架 Flink 与 Storm 的性能对比

    概述 将分布式实时计算框架 Flink 与 Storm 进行性能对比 为实时计算平台和业务提供数据参考 一 背景 Apache Flink 和 Apache Storm 是当前业界广泛使用的两个分布式实时计算框架 其中 Apache Sto
  • 04-分布式资源管理系统YARN

    目录 一 YARN简介 1 YARN的由来 2 什么是YARN 二 YARN原理 1 系统架构 1 1 角色分工 1 2 设计思想 1 3 工作机制 1 4 集群部署 2 YARN高可用 三 YARN资源调度策略 1 FIFO调度器 2 容
  • Android智能下拉刷新框架—SmartRefreshLayout的使用

    转载请注明出处 http blog csdn net jarchie520 article details 78193387 上个月因为自己太懒了 加上又发生了一点小事 就没能及时更新博客 下了班回家面壁思过去吧 今天这篇文章主要是介绍一下
  • 帮程序员减压放松的10个良心网站

    同学们工作之余 不妨放下微博跟朋友圈 来这10个网站感受一下看着就醉了的情境 念完往上一推音乐键 我往后一靠 潮乎乎的软皮耳机里头 音乐排山倒海 今天推荐的网站 利用代入感强的图片与音频 迅速帮你抹平焦虑 获得平和心态 特别献需求改千遍的程
  • LeetCode-3. 无重复字符的最长子串 -- Python解

    原题描述 给定一个字符串 s 请你找出其中不含有重复字符的 最长子串 的长度 示例 1 输入 s abcabcbb 输出 3 解释 因为无重复字符的最长子串是 abc 所以其长度为 3 示例 2 输入 s bbbbb 输出 1 解释 因为无
  • 2011年中的macmini 系统安装,简直作死

    不想再爱mac了 再不要爱了 完结 这几天真的时间就耗在这系统上了 之前一直用的是win10系统 直接把苹果系统整个的推掉了 由于是真的不知道能直接U盘装10 13版本 索性理所当然的直接一步到位到10 14最新版 所以花了半天时间找镜像d
  • HTML中Form表单的使用

    1 form表单标记 表单标记以
  • 金融圈:Hoping Club华英会将重金注资收购REVA

    近期 金融圈有消息传出 华英会或将注资收购REVA提高其所持有的股份 来获取REVA中国大陆区ArtStreet质押平台的运营权 这一消息受到了很多业内人士的关注 一旦此次收购坐实成功也就意味着华英会将获得 中国大陆REVA质押平台的运营权
  • Mybatis-plusMybatis 通过获取sqlSession执行原生sql(执行程序代码中sql字符串)

    Mybatis plus Mybatis通过获取sqlSession执行原生jdbc执行sql 此处demo只写了执行查询sql 有需要可以执行增删改查都可 与原生jdbc调用方式一样 Component Slf4j public clas
  • 178、锐捷交换机恢复出厂和各种基本配置

    锐捷最详细的基础命令 一 锐捷交换机配置原理 我们来看下锐捷的日常配置命令原理 1 进入特权模式 Ruijie gt enable 进入特权模式 2 查看设备flash当前文件列表 Ruijie dir 查看flash当前文件列表 3 将配
  • faster RCNN 的细节理解

    1 anchors不同的大小但是采用了ROI pooling一样的策略 都映射到3 3的卷积核上 最后通过1 1的卷积核 相当与全连接分成了18类 9个anchors的话 2 分类的时候 reshape 两次 第一次为了softmax分类
  • Go的并发的退出

    有时候我们需要通知goroutine停止它正在干的事情 比如一个正在执行计算的web服务 然而它的客户端已经断开了和服务端的连接 Go语言并没有提供在一个goroutine中终止另一个goroutine的方法 由于这样会导致goroutin
  • #452. 序列操作

    序列操作 题目 Daimayuan Online Judge 问题描述 思路 首先想的是第二次操作的y可以将前面所以操作进行抵消 只需要第二次操作的最大值即可 但是发现 对于第一个操作 它是单点修改 每修改一次对于第二次操作都是有影响的 导
  • 最简单的区块链实现,不到50行代码!(一)

    什么是区块链 Blockchain 一个电子记账本 以比特币和其他密码加密货币进行的交易公开地 按照日期顺序记录其中 总的来说 它是一个公开的数据库 新的数据存储在一个称为区块的容器中 并且附加到一个 不可变 的链条 即区块链 上 链条上还
  • 《基于Python的大数据分析基础及实战》第二章

    第二章 个人信息 kwd info kwd info kwd info ipynb等文件下载 https wwm lanzouf com iklXf023qeef 对数据进行分析首先得对数据进行处理 本章主要介绍P thon在数据处理方面的
  • 5.2 主机扫描:主机探测

    目录 一 预备知识 主机扫描方法 二 实验环境 三 实验步骤 一 预备知识 主机扫描方法 主机扫描 Host Scan 是指通过对目标网络 一般为一个或多个IP网段 中主机IP地址的扫描 以确定目标网络中有哪些主机处于运行状态 主机扫描的实
  • Ubuntu下,Java中利用JNI调用codeblocks c++生成的动态库的使用步骤

    1 打开新立得包管理器 搜索JDK 选择openjdk 6 jdk安装 2 打开Ubuntu软件中心 搜索Eclipse 选择Eclipse集成开发环境 安装 3 打开Eclipse File gt New gt Java Project