当前位置: 首页 > 编程日记 > 正文

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

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

相关文章:

比Hadoop快至少10倍的物联网大数据平台,我把它开源了

作者 | 陶建辉转载自爱倒腾的程序员&#xff08;ID: taosdata&#xff09;导读&#xff1a;7月12日&#xff0c;涛思数据的TDengine物联网大数据平台宣布正式开源。涛思数据希望尽最大努力打造开发者社区&#xff0c;维护这个开源的商业模式&#xff0c;他们相信不将最核心的代…

Script:挖掘AWR实现查询SCN历史增长走势

AWR中记录了快照时间内calls to kcmgas的统计值&#xff0c;calls to kcmgas的意义在于通过递归调用获得一个新的SCN&#xff0c;该统计值可以看做SCN增长速度的主要依据&#xff0c;通过挖掘AWR可以了解SCN的增长走势&#xff0c;对于我们诊断SCN HEADROOM问题有所帮助&#x…

运动目标检测__光流法

以下内容摘自一篇硕士论文《视频序列中运动目标检测与跟踪算法的研究》&#xff1a; 1950年Gibson首先提出了光流的概念&#xff0c;光流(optical flow)法是空间运动物体在观测成像面上的像素运动的瞬时速度。物体在运动的时候&#xff0c;它在图像上对应点的亮度模式也在做相…

读完这45篇论文,“没人比我更懂AI了”

作者 | 黄海广 转载自机器学习爱好者&#xff08;ID:ai-start-com&#xff09; 导读&#xff1a;AI领域的发展会是IT中最快的。我们所看到的那些黑科技&#xff0c;其后无不堆积了大量论文&#xff0c;而且都是最新、最前沿的论文。从某种角度来讲&#xff0c;它们所用的技术跟…

深入理解JVM——虚拟机GC

对象是否存活 Java的GC基于可达性分析算法(Python用引用计数法)&#xff0c;通过可达性分析来判定对象是否存活。这个算法的基本思想是通过一系列"GC Roots"的对象作为起始点&#xff0c;从这些节点开始向下搜索&#xff0c;搜索所走过的路径称为引用链&#xff0c;当…

​2019年最新华为、BAT、美团、头条、滴滴面试题目及答案汇总

作者 | 苏克1900来源 | 高级农民工&#xff08;ID&#xff1a;Mocun6&#xff09;【导语】最近 GitHub 上一个库火了&#xff0c;总结了 阿里、腾讯、百度、美团、头条等国内主流大厂的技术面试题目&#xff0c;目前 Star 2000&#xff0c;还在持续更新中&#xff0c;预计会火下…

华胜天成ivcs云系统初体验2

重启完成以后&#xff0c;就看到传统的linux init3级别的登录界面。输入用户名root 密码&#xff1a;123456 &#xff08;默认&#xff09;接下来的工作是配置一些东西&#xff0c;让它跑起来。首先&#xff0c;要修改IP地址&#xff0c;还有机器名。输入命令&#xff1a;ivcs…

OpenCV中响应鼠标信息cvSetMouseCallback函数的使用

转自&#xff1a;http://blog.csdn.net/haihong84/article/details/6599838 程序代碼如下&#xff1a; #include <cv.h> #include <highgui.h> #include <stdio.h void onMouse(int event,int x,int y,int flags,void* param ); int main(int argc, char** …

日常遇到的一些问题或知识的笔记(一)

1、坑爹的sessionStorage 一直以为sessionStorage、localStorage跟cookie一样&#xff0c;只要存在&#xff0c;整个域名下都可见&#xff0c;直到新开了一个窗口tab页&#xff0c;惊奇的发现下面的sessionStorage丢失了&#xff01; Web Storage 包含如下两种机制&#xff1a;…

你是“10倍工程师”吗?这个事,​国外小伙伴们都快“吵”起来了

整理 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;【导读】近日&#xff0c;推特上一个话题“10x工程师”异常火爆&#xff0c;引发的热议经久不散。这个话题由一位印度初创公司投资人 Shekhar Kirani 的一条推特引发&#xff0c;他写道&#xff1b;“如果…

运动目标跟踪__kalman

转自&#xff1a;http://blog.csdn.net/lindazhou2005/article/details/1534234 1、 什么是卡尔曼滤波器&#xff08;What is the Kalman Filter?&#xff09; 在学习卡尔曼滤波器之前&#xff0c;首先看看为什么叫“卡尔曼”。跟其他著名的理论&#xff08;例如傅立叶变换&a…

Spring工厂常识

环境搭建导入Sring对应的jar包导入Spring依赖的commons-loggin包导入log4j.properties在src下导入ApplicationContext.xml在任意目录下是一个轻量级的企业开发框架核心:IOC , AOP编程IOC:也就是inverse of control 控制反转 就是讲创建对象的权利转移到工厂中,从而实现解耦合和…

iframe子页面操作父页面

2019独角兽企业重金招聘Python工程师标准>>> 最近经常用到iframe&#xff0c;用的最多的就是在子页面中操作父页面的方法或变量等&#xff0c;总结了用到的几种方法&#xff0c;如下&#xff1a; var tableName window.parent.frames["mainFrame"].tNam…

ASP.NET MVC动作过滤器

ASP.NET MVC中包含以下4种不同类型的Action Filter&#xff1a; 类型使用时机接口实现方法授权过滤器(Authorization Filter)在执行任何Filter或Action之前被执行&#xff0c;用于进行身份验证IAuthorizationFilterAuthorizeAttribute动作过滤器(Action Filter)在执行Action之前…

什么限制了GNN的能力?首篇探究GNN普适性与局限性的论文出炉!

作者 | Andreas Loukas译者 | 凯隐责编 | Jane出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;【导读】GNN是目前机器学习领域的热门网络之一&#xff0c;肯多研究与技术分享相比不可知的深度学习网络模型&#xff0c;GNN 有哪些吸引我们的优势及硬核实力。然而&…

OpenCV运动检测跟踪(blob track)框架组成模块详解

在..\opencv\doc\vidsurv文件夹中有三个doc文件&#xff0c;Blob_Tracking_Modules、Blob_Tracking_Tests、TestSeq&#xff0c;其中Blob_Tracking_Modules必须需要详读的。 “FG/BG Detection” module performsforeground/background segmentation for each pixel. “Blob E…

vi和软件安装

一 vi编辑器简介 vim 全屏幕纯文本编辑器 二 vim使用 1 vi 模式 vi 文件名 命令模式 输入模式 末行模式 命令----》输入 a&#xff1a;追加 i&#xff1a;插入 o&#xff1a;打开 i 命令----》末行 :w 保存 :q 不保存退出 2 命令模式操作 1&#xff09;…

鸟哥学习笔记---网络安全基础

yum clean [packages|header|all] packages:将已下载的软件文件删除 headers&#xff1a;将下载的软件文件头删除 all:将所有容器数据都删除 添加镜像站点&#xff1a;mirrorlisthttp://ftp.twaren.net/Linux/CentOS/6/os/x86_64/ http://free.nchc.org.tw/drbl-core/i386/RPMS…

使用纯C++实现SQL Server2005 数据库读写操作详细步骤

环境&#xff1a;虚拟机windows xp&#xff0c;vs2008 SQLServer 2005 Express 数据库访问技术采用ADO。 需要安装的软件包括&#xff1a;microsoft_dotnetfxchs2.0.exe、WindowsInstaller-KB893803-v2-x86.exe、SQLEXPR32_CHS.EXE、SQLServer2005_SSMSEE.msi、SQLServer200…

硬核吃瓜!上万条数据撕开微博热搜真相

作者 | 徐麟来源 | 转载自数据森麟&#xff08;ID:shujusenlin&#xff09;吃瓜前言关于新浪微博&#xff0c;向来都是各路吃瓜群众聚集之地&#xff0c;大家在微博中可以尽情吃瓜&#xff0c;各种类型的瓜应有尽有&#xff0c;只有你想不到的&#xff0c;没有你吃不到的。微博…

python类的__slots__属性、__del__属性、上下文(__enter__和__exit__)、

常规情况下&#xff0c;类的属性字典是共享的&#xff0c;而实例的字典是独立的。如果一个类的属性较少&#xff0c;但是拥有很多的实例&#xff0c;这些实例的属性字典会占用较多的内存空间。对这样的类来说&#xff0c;为了节省内存空间&#xff0c;可以使用__slots__类变量代…

普通帧,关键帧,空白关键帧的区别

1. 特点 帧——是进行flash动画制作的最基本的单位&#xff0c;每一个精彩的flash动画都是由很多个精心雕琢的帧构成的&#xff0c;在时间轴上的每一帧都可以包含需要显示的所有内容&#xff0c;包括图形、声音、各种素材和其他多种对象。 关键帧——顾名思义&#xff0c;有关键…

Spark入门系列(二)| 1小时学会RDD编程

作者 | 梁云1991转载自Python与算法之美&#xff08;ID:Python_Ai_Road&#xff09;导读&#xff1a;本文为 Spark入门系列的第二篇文章&#xff0c;主要介绍 RDD 编程&#xff0c;实操性较强&#xff0c;感兴趣的同学可以动手实现一下。RDD 是弹性分布式数据集(Resilient Dist…

Office2010启动慢的解决方法

以word2010为例&#xff1a; 解决启动慢的问题&#xff1a; 转自&#xff1a;http://www.blue1000.com/bkhtml/2011-12/70698.htm 首先启动Word2010&#xff0c;-->单击进入“文件”选项卡-->选择左边的“选项”按钮-->弹出“word选项”对话框窗口&#xff0c;-->…

如何在 Vue 项目中使用 echarts

数据的重要性我们大家都知道&#xff0c;就算再小的项目中都可能使用几个图表展示&#xff0c;我最近在做项目的过程中也是需要用到图表&#xff0c;最后选择了echarts 图表库&#xff0c;为什么选择 echarts&#xff0c;第一&#xff1a;简单上手容易&#xff0c;第二&#xf…

OpenCV实现在图像中写入汉字

由于OpenCV自带的cvInitFont和cvPutText函数不支持向图像中写入中文&#xff0c;参考http://www.opencv.org.cn/forum/viewtopic.php?t2083 中的方法&#xff0c;在windows7 64位机上用vs2008OpenCV2.3.1实现具体步骤如下&#xff1a; 1、新建一个控制台工程Test&#xff0c;先…

Operations Manager 2012 SP1配置部署系列之(二) SCOM监控SCVMM

你可以使用Operations Mangager连接到VMM上去监控VMM管理的虚拟机和虚拟机的主机的健康和可用性.你还可以监视VMM管理服务器的健康和可用性&#xff0c;VMM数据库服务器、存储库服务器&#xff0c;和矢量调制法的自服务门户web服务器.当你把VMM与Operations Mangager集成、VMM的…

ROS中base_link, odom, fixed_frame, target_frame和虚拟大地图map的关系

前面已经介绍了如何使用URDF建造机器人小车并显示在Rviz的仿真环境里面&#xff0c;但是小车是静止的。下面介绍如何让它在Rviz里面动起来&#xff0c;并理清URDF,TF 和 odom 的关系。 1. ROS中base_link, odom, fixed_frame, target_frame和虚拟大地图map的关系 一般在urdf文件…

谷歌新研究:基于数据共享的神经网络快速训练方法

作者 | Google Brain译者 | 凯隐责编 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;导读&#xff1a;神经网络技术的普及离不开硬件技术的发展&#xff0c;GPU 和 TPU 等硬件型训练加速器带来的高算力极大的缩短了训练模型需要的时间&#xff0c;使得研究者们…