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的效率也一直在提 ...
随机推荐
- PTA之求单链表结点的阶乘和
本题要求实现一个函数,求单链表L结点的阶乘和.这里默认所有结点的值非负,且题目保证结果在int范围内. 时间限制: 400ms 内存限制: 64MB 代码长度限制: 16KB 函数接口定义: int ...
- codeforces 758D Ability To Convert【DP】
在N进制下给你一个数,要你转换成最小的十进制数; 状态转移方程:从前向后 dp[j]表示j位前数列的最小十进制数 dp[j]=min(dp[j],dp[i]*n+x) 程序: #include < ...
- Codeforces 1114F Please, another Queries on Array? 线段树
Please, another Queries on Array? 利用欧拉函数的计算方法, 用线段树搞一搞就好啦. #include<bits/stdc++.h> #define LL ...
- Strom的集群停止以及启动
一:停止 1.概述 关于strom没有停止命令 2.第一种方式(kill) jps之后 使用bin/strom -kill wordcount 3.第二种方式(书写脚本) 4.先新建superviso ...
- Ubuntu 下常用命令
整理一下比较常用的操作命令: 附上一个Linux 命令大全: http://man.linuxde.net/ 打开终端:Ctrl+Alt+T ls: ls : 查看当前路径下的文件夹以及文件 ls + ...
- HDU 1503【LCS】(字符串合并输出)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1503 题目大意: 给两个字符串,组成一个长度尽可能小的字符串,它包含上述两个字符串,且原字符串中的字符 ...
- Python3 卷积神经网络卷积层,池化层,全连接层前馈实现
# -*- coding: utf-8 -*- """ Created on Sun Mar 4 09:21:41 2018 @author: markli " ...
- 操作系统概述(os 笔记一)
操作系统概述 操作系统的目标和功能 1.目标:作为用户/计算机接口 计算机的使用人群大致可以分为三类,终端用户,程序开发者,操作系统设计人员. 对于终端用户,即应用程序的用户来说,他们通常不关注计 ...
- java 三目运算符
三目运算符 可以内嵌使用. level=(input>90)?"Class A":(input>60)?"Class B":"Class ...
- VUE 2.x SEO 优化问题 vue-meta-info && prerender-spa-plugin 配合使用
VUE 2.x SEO 优化问题,以及预渲染问题 1.新建项目可以采用nuxt.js , 配置meta.以及预渲染 都很方便,官网文档都很详细: 2.对于已有项目: vue-meta-info & ...