Ubuntu下,Java中利用JNI调用codeblocks c++生成的动态库的使用步骤
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++生成的动态库的使用步骤相关推荐
- windows7下,Java中利用JNI调用c++生成的动态库的使用步骤
1.从http://www.oracle.com/technetwork/java/javase/downloads/jdk-7u2-download-1377129.html下载jdk-7u2-wi ...
- Java如何利用JNI调用C++(简略介绍及步骤)
Java如何利用JNI调用C++(简略介绍及步骤) 文章目录 Java如何利用JNI调用C++(简略介绍及步骤) 一.原理介绍 二.详细步骤 步骤一:编写Java类 步骤二:生成.h文件 步骤三:CL ...
- 【Qt】Qt6调用Visual Studio2019生成的动态库详解
00. 目录 文章目录 00. 目录 01. 开发环境 02. Visual Studio 2019生成动态库 03. 新建Qt项目 04. 编写测试程序 05. 其它参考 06. 附录 01. 开发 ...
- Java中使用JNI调用本地动态库的方法
在Java中,要使用动态库,就要使用到 JNI.首先来看看百度百科对JNI的描述:从Java1.1开始,Java Native Interface(JNI)标准成为Java平台的一部分,它允许Java ...
- Java中利用qqemai发送QQ邮件
最近自己了解下Java中利用mai发送QQ邮件 1.QQ邮箱设置 1.1 进去QQ邮箱-->设置-->账号-->进行设置如下图 以下源码 package test; import j ...
- Java利用JNI调用c++代码简易例子演示
点击打开链接 (提取码:8676) 一.首先简单交代一下两个问题: 1.什么是JNI - - - JNI的全名为Java Native Interface(Jav ...
- java调用jni接口,Java 中通过jni接口调用native code
[ Java语言本身是通过Java的虚拟机解释执行的,因此对于Java中调用本地动态链接库的问题便提上了日程,为何会存在这样的需求呢?因为Java本身的机制导致一些要求高效率 在上上篇中已经介绍 ...
- java中没有直接调用matlab的接口函数
java中没有直接调用matlab的接口函数,在通常的情况下我们是通过借用C++作为中间过程来实现的,使用C++主要是用c与matlab的结构实现c调用matlab的功能,将这些功能函数封装成dll文 ...
- c#获取对象的唯一标识_在 Java 中利用 redis 实现分布式全局唯一标识服务
作者: 杨高超 juejin.im/post/5a4984265188252b145b643e 获取全局唯一标识的方法介绍 在一个IT系统中,获取一个对象的唯一标识符是一个普遍的需求.在以前的单体应用 ...
最新文章
- java axis2 jar_Java axis2.jar包详解及缺少jar包错误分析
- php和python web开发-Web开发应该学习php还是python
- 利用vue和jQuery实现中国主要城市搜索与选择
- STEAM 97%好评,体验堪比《杀戮尖塔》,为什么玩家说这是2020年上半年最超值的游戏?
- 练习算法之前必须了解的多件事
- matlab2012b函数问题,MATLAB版本(2012b 64bit)在尝试调用svmtrain函数时报错
- easyui-treegrid的案例
- java 面向对象 1
- 删除none 的images报错 image has dependent child images 解决办法
- 瑞友天翼服务器系统资源不足,瑞友天翼问题处理
- 2022年最新的百度云盘在线倍速播放实践可用
- 风控建模一、初步认识风控
- 单片机c语言数字频率计的课程设计,课程设计基于单片机的简易数字频率计报告.doc...
- MyBatis批量插入几千条数据,请慎用foreach
- Scheme语言基础之数据类型
- pygame交换式拼图设计
- 十个设计师必备网站,解决你设计的所有难题
- 计算机向u盘拷贝速度慢,U盘读写拷贝速度慢的解决措施
- 2023中国数据安全发展趋势十大预测
- 波束赋形技术lms算法在matlab仿真,自适应波束成形算法LMS、RLS、VSSLMS分解