Java中类型与C/C++中对应关系
 
Java中的类的对应
 
Sign签名, 用来识别对应各个方法。
JDK下的javap.exe能输出签名。用法javap -s -p 完整类名
 
 

  下面是几个例子程序:

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学习小结的更多相关文章

  1. dubbo学习小结

    dubbo学习小结 参考: https://blog.csdn.net/paul_wei2008/article/details/19355681 https://blog.csdn.net/liwe ...

  2. flex学习小结

    接触到flex一个多月了,今天做一个学习小结.如果有知识错误或者意见不同的地方.欢迎交流指教. 画外音:先说一下,我是怎么接触到flex布局的.对于正在学习的童鞋们,我建议大家没事可以逛逛网站,看看人 ...

  3. Python 学习小结

    python 学习小结 python 简明教程 1.python 文件 #!/etc/bin/python #coding=utf-8 2.main()函数 if __name__ == '__mai ...

  4. react学习小结(生命周期- 实例化时期 - 存在期- 销毁时期)

    react学习小结   本文是我学习react的阶段性小结,如果看官你是react资深玩家,那么还请就此打住移步他处,如果你想给一些建议和指导,那么还请轻拍~ 目前团队内对react的使用非常普遍,之 ...

  5. objective-c基础教程——学习小结

    objective-c基础教程——学习小结   提纲: 简介 与C语言相比要注意的地方 objective-c高级特性 开发工具介绍(cocoa 工具包的功能,框架,源文件组织:XCode使用介绍) ...

  6. pthread多线程编程的学习小结

    pthread多线程编程的学习小结  pthread 同步3种方法: 1 mutex 2 条件变量 3 读写锁:支持多个线程同时读,或者一个线程写     程序员必上的开发者服务平台 —— DevSt ...

  7. ExtJs学习笔记之学习小结LoginDemo

    ExtJs学习小结LoginDemo 1.示例:(登录界面) <!DOCTYPE html> <html> <head> <meta charset=&quo ...

  8. 【转】JNI学习积累之一 ---- 常用函数大全

    原文网址:http://blog.csdn.net/qinjuning/article/details/7595104 本文原创,转载请注明出处:http://blog.csdn.net/qinjun ...

  9. JNI学习总结

    JNI学习总结 标签(空格分隔): java JNI:Java Native Interface,是一种通过java调用本地方法的技术(当然也可以反过来),随着JDK版本的提升,JNI的效率也一直在提 ...

随机推荐

  1. Math对象的常用属性和方法

    属性 描述 Math.PI 返回π(3.1415926) 方法 描述 Math.round() 将数字四舍五入到离它最近的整数 Math.sart(n) 返回平方根,例如Math.sart(9)返回3 ...

  2. 一.hadoop入门须知

    目录: 1.hadoop入门须知 2.hadoop环境搭建 3.hadoop mapreduce之WordCount例子 4.idea本地调试hadoop程序 5.hadoop 从mysql中读取数据 ...

  3. Velocity.js初识

    Velocity.js官网:http://julian.com/research/velocity/ 兼容IE8和Android2.3 Velocity.js基本用法 效果图: CSS .box{ w ...

  4. SimInfo获取(MCC, MNC, PLMN)

    String NUMERIC = getSIMInfo(); protected String getSIMInfo() { TelephonyManager iPhoneManager = (Tel ...

  5. .NetCore源码阅读笔记系列之Security (四) Authentication & AddJwtBearer

    接下来我们在来看下AddJwtBearer,这个与AddOpenIdConnect不太一样,后者是远程发起身份认证请求是一种主动发起式的,多用于web等客户端,验证发生在身份认证服务端,而前者是一种被 ...

  6. CS224d 单隐层全连接网络处理英文命名实体识别tensorflow

    什么是NER? 命名实体识别(NER)是指识别文本中具有特定意义的实体,主要包括人名.地名.机构名.专有名词等.命名实体识别是信息提取.问答系统.句法分析.机器翻译等应用领域的重要基础工具,作为结构化 ...

  7. day10--进程

        进程: Python 解释器有一个全局解释器锁(PIL),导致每个 Python 进程中最多同时运行一个线程,因此 Python 多线程程序并不能改善程序性能,不能发挥多核系统的优势,可以通过 ...

  8. c++ primer 笔记 (二)

    第二章笔记  (貌似记得有点多)   把负值赋给unsigned对象时完全合法的,其结果是该负数对该类型的取值个数求模后的值   -1     (对265求模)  255   float型只能保证6位 ...

  9. Codeforces 788C The Great Mixing

    The Great Mixing 化简一下公式后发现, 问题变成了, 取最少多少数能使其和为1, bitset优化一下背包就好啦. 题解中介绍了一种bfs的方法没, 感觉比较巧妙. #include& ...

  10. POJ 3070 Fibonacci 【矩阵快速幂】

    <题目链接> Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 ...