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的效率也一直在提 ...
随机推荐
- Math对象的常用属性和方法
属性 描述 Math.PI 返回π(3.1415926) 方法 描述 Math.round() 将数字四舍五入到离它最近的整数 Math.sart(n) 返回平方根,例如Math.sart(9)返回3 ...
- 一.hadoop入门须知
目录: 1.hadoop入门须知 2.hadoop环境搭建 3.hadoop mapreduce之WordCount例子 4.idea本地调试hadoop程序 5.hadoop 从mysql中读取数据 ...
- Velocity.js初识
Velocity.js官网:http://julian.com/research/velocity/ 兼容IE8和Android2.3 Velocity.js基本用法 效果图: CSS .box{ w ...
- SimInfo获取(MCC, MNC, PLMN)
String NUMERIC = getSIMInfo(); protected String getSIMInfo() { TelephonyManager iPhoneManager = (Tel ...
- .NetCore源码阅读笔记系列之Security (四) Authentication & AddJwtBearer
接下来我们在来看下AddJwtBearer,这个与AddOpenIdConnect不太一样,后者是远程发起身份认证请求是一种主动发起式的,多用于web等客户端,验证发生在身份认证服务端,而前者是一种被 ...
- CS224d 单隐层全连接网络处理英文命名实体识别tensorflow
什么是NER? 命名实体识别(NER)是指识别文本中具有特定意义的实体,主要包括人名.地名.机构名.专有名词等.命名实体识别是信息提取.问答系统.句法分析.机器翻译等应用领域的重要基础工具,作为结构化 ...
- day10--进程
进程: Python 解释器有一个全局解释器锁(PIL),导致每个 Python 进程中最多同时运行一个线程,因此 Python 多线程程序并不能改善程序性能,不能发挥多核系统的优势,可以通过 ...
- c++ primer 笔记 (二)
第二章笔记 (貌似记得有点多) 把负值赋给unsigned对象时完全合法的,其结果是该负数对该类型的取值个数求模后的值 -1 (对265求模) 255 float型只能保证6位 ...
- Codeforces 788C The Great Mixing
The Great Mixing 化简一下公式后发现, 问题变成了, 取最少多少数能使其和为1, bitset优化一下背包就好啦. 题解中介绍了一种bfs的方法没, 感觉比较巧妙. #include& ...
- POJ 3070 Fibonacci 【矩阵快速幂】
<题目链接> Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 ...