JNI学习小结



下面是几个例子程序:
1、C++本地方法中获取Java中的变量以及调用Java中的方法
Java代码:
package com.test; import java.util.Date; public class TestNative {
public native void sayHello();
private int a = 10;
public int function(int x,Date date,int[] y){
System.out.println("function");
return 0;
}
public double max(double a,double b){
return a>b?a:b;
}
/**
* @param args
*/
public static void main(String[] args) {
System.loadLibrary("NativeCode");
TestNative tNative = new TestNative();
tNative.sayHello();
} }
C++本地代码:
com_test_TestNative.h代码省略了
#include<iostream.h>
#include"com_test_TestNative.h" JNIEXPORT void JNICALL Java_com_test_TestNative_sayHello(JNIEnv *env, jobject obj)
{
//因为sayHello不是静态函数,所以传进来的obj就是调用这个函数的对象,否则就是传入native方法所在的类
jclass hello_clazz = env->GetObjectClass(obj); //得到的就是native方法所在的类
// jfieldID fieldId_a = env->GetFieldID(hello_clazz,"a","I");
// jmethodID methodId_fun = env->GetMethodID(hello_clazz,"function","(ILjava/util/Date;[I)I");
// env->CallIntMethod(obj,methodId_fun,0L,NULL,NULL); //方法调用
// cout<<"hello world!"<<endl;
// cout<<"successful"<<endl;
/*
jfieldID field_a = env->GetFieldID(hello_clazz,"a","I"); //得到字段a的ID
jint a = env->GetIntField(obj,field_a); //得到字段a的值
cout<<a<<endl;
env->SetIntField(obj,field_a,100L);
*/
jmethodID methodId_max = env->GetMethodID(hello_clazz,"max","(DD)D");
jvalue *values = new jvalue[]; //jvalue是用来向java函数中传参数的
values[].d = 3.14;
values[].d = 3.22;
//jdouble max = env->CallDoubleMethod(obj,methodId_max,3.18,3.15); //第一种方法调用
jdouble max = env->CallDoubleMethodA(obj,methodId_max,values); //第二种方法调用
delete [] values;
cout<<max<<endl; }
2、C++本地方法中对Java中的字符串操作(实现用户输入一个字符串,在C++中对其反转)
Java代码:
package com.test; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader; public class TestStr {
public native void cppCode();
private String message;
public static void main(String[] args) throws IOException {
System.loadLibrary("CPP");
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String str = reader.readLine();
TestStr obj = new TestStr();
obj.message = str;
obj.cppCode();
System.out.println("java :"+obj.message);
} }
c++本地方法:
com_test_TestStr.h省略了
#include "com_test_TestStr.h"
#include<windows.h>
#include<string>
#include<algorithm>
using namespace std;
JNIEXPORT void JNICALL Java_com_test_TestStr_cppCode(JNIEnv *env, jobject obj)
{
jfieldID fid_msg = env->GetFieldID(env->GetObjectClass(obj),"message","Ljava/lang/String;");
jstring j_msg = (jstring)env->GetObjectField(obj,fid_msg);
jsize len = env->GetStringLength(j_msg); //得到字符串的长度
jchar* jstr = new jchar[len+]; //申请空间
jstr[len] = L'\0';
env->GetStringRegion(j_msg,,len,jstr);
//env->ReleaseStringChars(j_msg,jstr);
//MessageBoxW(NULL,(const wchar_t*)jstr,L"Title",MB_OK);
wstring wstr((const wchar_t*)jstr);
delete[] jstr; //释放空间
std::reverse(wstr.begin(),wstr.end()); //字符串反转
jstring j_new_str = env->NewString((const jchar*)wstr.c_str(),(jint)wstr.size()); //创建一个新的字符串
env->SetObjectField(obj,fid_msg,j_new_str); //设置字符串给java对象 }
3、C++本地方法中获取Java中的数组(实现用C++本地方法将Java中的数组排序)
Java代码:
package com.test; public class TestArray { public int[] array = {,,,,,,,,,}; public native void callCppFun(); public static void main(String[] args) {
System.loadLibrary("TestArray");
TestArray obj = new TestArray();
obj.callCppFun();
for(int a:obj.array){
System.out.println(a);
}
} }
C++本地代码:
com_test_TestArray.h省略了
#include"com_test_TestArray.h"
#include<iostream>
#include<algorithm>
using namespace std;
JNIEXPORT void JNICALL Java_com_test_TestArray_callCppFun (JNIEnv *env, jobject obj)
{
jfieldID fid_array = env->GetFieldID(env->GetObjectClass(obj),"array","[I"); //获取数组的id
jintArray jint_array = (jintArray)env->GetObjectField(obj,fid_array); jint* int_arr = env->GetIntArrayElements(jint_array,NULL); //转化为jint数组
jsize len = env->GetArrayLength(jint_array);
std::sort(int_arr,int_arr+len); //对数组进行排序
env->ReleaseIntArrayElements(jint_array,int_arr,); //0:释放C++数组,并且更新到Java
/* for(jsize i=0;i<len;i++){
cout<<int_arr[i]<<endl;
}
*/
// env->ReleaseIntArrayElements(jint_array,int_arr,JNI_ABORT);//JNI_ABORT:释放C++数组,但是不更新到Java
}
JNI学习小结的更多相关文章
- dubbo学习小结
dubbo学习小结 参考: https://blog.csdn.net/paul_wei2008/article/details/19355681 https://blog.csdn.net/liwe ...
- flex学习小结
接触到flex一个多月了,今天做一个学习小结.如果有知识错误或者意见不同的地方.欢迎交流指教. 画外音:先说一下,我是怎么接触到flex布局的.对于正在学习的童鞋们,我建议大家没事可以逛逛网站,看看人 ...
- Python 学习小结
python 学习小结 python 简明教程 1.python 文件 #!/etc/bin/python #coding=utf-8 2.main()函数 if __name__ == '__mai ...
- react学习小结(生命周期- 实例化时期 - 存在期- 销毁时期)
react学习小结 本文是我学习react的阶段性小结,如果看官你是react资深玩家,那么还请就此打住移步他处,如果你想给一些建议和指导,那么还请轻拍~ 目前团队内对react的使用非常普遍,之 ...
- objective-c基础教程——学习小结
objective-c基础教程——学习小结 提纲: 简介 与C语言相比要注意的地方 objective-c高级特性 开发工具介绍(cocoa 工具包的功能,框架,源文件组织:XCode使用介绍) ...
- pthread多线程编程的学习小结
pthread多线程编程的学习小结 pthread 同步3种方法: 1 mutex 2 条件变量 3 读写锁:支持多个线程同时读,或者一个线程写 程序员必上的开发者服务平台 —— DevSt ...
- ExtJs学习笔记之学习小结LoginDemo
ExtJs学习小结LoginDemo 1.示例:(登录界面) <!DOCTYPE html> <html> <head> <meta charset=&quo ...
- 【转】JNI学习积累之一 ---- 常用函数大全
原文网址:http://blog.csdn.net/qinjuning/article/details/7595104 本文原创,转载请注明出处:http://blog.csdn.net/qinjun ...
- JNI学习总结
JNI学习总结 标签(空格分隔): java JNI:Java Native Interface,是一种通过java调用本地方法的技术(当然也可以反过来),随着JDK版本的提升,JNI的效率也一直在提 ...
随机推荐
- python 全栈开发,Day54(jQuery的属性操作,使用jQuery操作input的value值,jQuery的文档操作)
昨日内容回顾 jQuery 宗旨:write less do more 就是js的库,它是javascript的基础上封装的一个框架 在前端中,一个js文件就是一个模块 一.用法: 1.引入包 2.入 ...
- 步步为营-57-JQuery练习题
01 点谁谁哭 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head&g ...
- (第2篇)一篇文章教你轻松安装hadoop
摘要: 这篇文章将会手把手教你安装hadoop,只要你细心按照文章中的步骤操作,hadoop肯定能正确安装,绝对不会让你崩溃 博主福利 给大家赠送一套hadoop视频课程 授课老师是百度 hadoop ...
- eclipse无法添加tomcat
问题如图所示 就是选择对应的版本无法选择硬盘里面的tomcat文件 关闭Eclipse 删除WorkSpace目录下/.metadata/.plugins/org.eclipse.core.runti ...
- PHP函数之array_chunk
有时候需要对数组进行按分页处理,之前的做法是计算出数组大小,按分页计算出偏移量,再从起始偏移量处开始遍历页大小个数据.现在不用这么麻烦了,原来PHP函数里有个现成的函数array_chunk可以配合我 ...
- 基于Socket的低层次Java网络编程
Socket通讯 网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket.Socket通常用来实现客户方和服务方的连接.Socket是TCP/IP协议的一个十分流 ...
- Luogu2570 [ZJOI2010]贪吃的老鼠 ---- 网络流
Luogu2570 [ZJOI2010]贪吃的老鼠 题面描述 https://www.luogu.org/problemnew/show/P2570 然后题意大概就是m只老鼠,然后吃n个奶酪,已知 ...
- 项目冲刺Forth
Forth Sprint 1.各个成员今日完成的任务 蔡振翼:修改部分博客 谢孟轩:续借功能和编辑资料功能的实现 林凯:初步实现登录功能 肖志豪:帮助其他人解决一些问题 吴文清:编写完善管理员个人界面 ...
- BZOJ.4553.[HEOI2016&TJOI2016]序列(DP 树状数组套线段树/二维线段树(MLE) 动态开点)
题目链接:BZOJ 洛谷 \(O(n^2)\)DP很好写,对于当前的i从之前满足条件的j中选一个最大值,\(dp[i]=d[j]+1\) for(int j=1; j<i; ++j) if(a[ ...
- 潭州课堂25班:Ph201805201 并发(非阻塞,epoll) 第十课 (课堂笔记)
# -*- coding: utf-8 -*- # 斌彬电脑 # @Time : 2018/7/12 0012 20:29 import socket server = socket.socket() ...