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

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

3、  打开Eclipse,File-->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::Blocks,file-->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目录,并添加到工程中,分别在Release和Debug下,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(Release或Debug)拷贝到/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

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

  1. windows7下,Java中利用JNI调用c++生成的动态库的使用步骤

    1.从http://www.oracle.com/technetwork/java/javase/downloads/jdk-7u2-download-1377129.html下载jdk-7u2-wi ...

  2. Java如何利用JNI调用C++(简略介绍及步骤)

    Java如何利用JNI调用C++(简略介绍及步骤) 文章目录 Java如何利用JNI调用C++(简略介绍及步骤) 一.原理介绍 二.详细步骤 步骤一:编写Java类 步骤二:生成.h文件 步骤三:CL ...

  3. 【Qt】Qt6调用Visual Studio2019生成的动态库详解

    00. 目录 文章目录 00. 目录 01. 开发环境 02. Visual Studio 2019生成动态库 03. 新建Qt项目 04. 编写测试程序 05. 其它参考 06. 附录 01. 开发 ...

  4. Java中使用JNI调用本地动态库的方法

    在Java中,要使用动态库,就要使用到 JNI.首先来看看百度百科对JNI的描述:从Java1.1开始,Java Native Interface(JNI)标准成为Java平台的一部分,它允许Java ...

  5. Java中利用qqemai发送QQ邮件

    最近自己了解下Java中利用mai发送QQ邮件 1.QQ邮箱设置 1.1 进去QQ邮箱-->设置-->账号-->进行设置如下图 以下源码 package test; import j ...

  6. Java利用JNI调用c++代码简易例子演示

    点击打开链接 (提取码:8676) 一.首先简单交代一下两个问题: 1.什么是JNI                - - -     JNI的全名为Java Native Interface(Jav ...

  7. java调用jni接口,Java 中通过jni接口调用native code

    [    Java语言本身是通过Java的虚拟机解释执行的,因此对于Java中调用本地动态链接库的问题便提上了日程,为何会存在这样的需求呢?因为Java本身的机制导致一些要求高效率 在上上篇中已经介绍 ...

  8. java中没有直接调用matlab的接口函数

    java中没有直接调用matlab的接口函数,在通常的情况下我们是通过借用C++作为中间过程来实现的,使用C++主要是用c与matlab的结构实现c调用matlab的功能,将这些功能函数封装成dll文 ...

  9. c#获取对象的唯一标识_在 Java 中利用 redis 实现分布式全局唯一标识服务

    作者: 杨高超 juejin.im/post/5a4984265188252b145b643e 获取全局唯一标识的方法介绍 在一个IT系统中,获取一个对象的唯一标识符是一个普遍的需求.在以前的单体应用 ...

最新文章

  1. java axis2 jar_Java axis2.jar包详解及缺少jar包错误分析
  2. php和python web开发-Web开发应该学习php还是python
  3. 利用vue和jQuery实现中国主要城市搜索与选择
  4. STEAM 97%好评,体验堪比《杀戮尖塔》,为什么玩家说这是2020年上半年最超值的游戏?
  5. 练习算法之前必须了解的多件事
  6. matlab2012b函数问题,MATLAB版本(2012b 64bit)在尝试调用svmtrain函数时报错
  7. easyui-treegrid的案例
  8. java 面向对象 1
  9. 删除none 的images报错 image has dependent child images 解决办法
  10. 瑞友天翼服务器系统资源不足,瑞友天翼问题处理
  11. 2022年最新的百度云盘在线倍速播放实践可用
  12. 风控建模一、初步认识风控
  13. 单片机c语言数字频率计的课程设计,课程设计基于单片机的简易数字频率计报告.doc...
  14. MyBatis批量插入几千条数据,请慎用foreach
  15. Scheme语言基础之数据类型
  16. pygame交换式拼图设计
  17. 十个设计师必备网站,解决你设计的所有难题
  18. 计算机向u盘拷贝速度慢,U盘读写拷贝速度慢的解决措施
  19. 2023中国数据安全发展趋势十大预测
  20. 波束赋形技术lms算法在matlab仿真,自适应波束成形算法LMS、RLS、VSSLMS分解

热门文章

  1. RANSAC算法(2):(拟合平面)本文以地面为基础以及源码分布解读
  2. PCL:官方程序 Region growing segmentation
  3. 图像几何变换C++实现--镜像,平移,旋转,错切,缩放
  4. 文件系统类型是ntfs无法确定卷版本和状态_硬盘写到一半时断电,文件系统里会发什么?...
  5. 环回测试能够提供什么信息_以太网测试仪
  6. 设计模式 之美 -- 原型模式
  7. 增加内核的ceph模块的日志打印
  8. 算法导论课后习题解析 第四章 上
  9. python pexpect包的一些用法
  10. 转载iOS开发中常见的警告及错误