1.定义java类中的native方法,新建下面一个类

public class NativeDemo {

public static native void say(); //static的native方法

public native void sayHello(); //实例的native方法,两者的处理不一样

public static int number = 10;

int a = 2;

public void callThis(){

System.out.println("c++ call java method");

}

public static void main(String[] args) {

System.loadLibrary("NativeJni");

// NativeDemo.sayHello();

new NativeDemo().sayHello();

say();

}

}

2.进入java命令行

D:\project\workplatform.apps.demoLearnCenter\src\main\java>javah -help

用法:javah [选项]

其中 [选项] 包括:

-help 输出此帮助消息并退出

-classpath 用于装入类的路径

-bootclasspath 用于装入引导类的路径

-d 输出目录

-o 输出文件(只能使用 -d 或 -o 中的一个)

-jni 生成 JNI样式的头文件(默认)

-version 输出版本信息

-verbose 启用详细输出

-force 始终写入输出文件

使用全限定名称指定 (例

如,java.lang.Object)。

D:\project\workplatform.apps.demoLearnCenter\src\main\java>javap -help

Usage: javap ...

where options include:

-c Disassemble the code

-classpath Specify where to find user class files

-extdirs Override location of installed extensions

-help Print this usage message

-J Pass directly to the runtime system

-l Print line number and local variable tables

-public Show only public classes and members

-protected Show protected/public classes and members

-package Show package/protected/public classes

and members (default)

-private Show all classes and members

-s Print internal type signatures

-bootclasspath Override location of class files loaded

by the bootstrap class loader

-verbose Print stack size, number of locals and args for methods

If verifying, print reasons for failure

3.在vc++新建一个dll的控制台工程

4.在vc的工程里面导入刚才的那个NativeDemo.h的头文件,然后因为这个头文件需要引用jdk安装目录下的jni.h和jni_mt.h的两个头文件,从jdk的安装目录下的拷贝到工程里面

4.编写NativeDemo.h的头文件定义的两个类的实现(这里需要吧jni.h include的时候要改为“”,而不是<>,因为jni.h是在当前工程里面)

/* DO NOT EDIT THIS FILE - it is machine generated */

#include "jni.h"

/* Header for class NativeDemo */

#ifndef _Included_NativeDemo

#define _Included_NativeDemo

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class: NativeDemo

* Method: say

* Signature: ()V

*/

JNIEXPORT void JNICALL Java_NativeDemo_say

(JNIEnv *, jclass);

/*

* Class: NativeDemo

* Method: sayHello

* Signature: ()V

*/

JNIEXPORT void JNICALL Java_NativeDemo_sayHello

(JNIEnv *, jobject);

#ifdef __cplusplus

}

#endif

#endif

c++源文件

#include "NativeDemo.h"

#include "jni.h"

#include

using namespace std;

JNIEXPORT void JNICALL Java_NativeDemo_say(JNIEnv * env, jclass jclazz) //static的方法生成的两个参数是JNIEnv * env, jclass jclazz,第二个参数代表java的类的class实例

{

jclass jclass_native = env->FindClass("NativeDemo"); //查找类的class对象,

jfieldID jfield_numberId = env->GetStaticFieldID(jclass_native,"number", "I"); //获得jclazz类的静态字段number,第三个参数代表静态变量的签名,java每种类型对应到一个签名串

jint jfield_number = env->GetStaticIntField(jclass_native, jfield_numberId);//获得jclazz类的静态变量的值

cout << jfield_number << endl; //打印静态变量的值

}

JNIEXPORT void JNICALL Java_NativeDemo_sayHello(JNIEnv *env, jobject jobj)//实例方法生成的第二个参数是jobject,代表某一个实例

{

jclass clazz = env->GetObjectClass(jobj); //获得实例jobj的class对象

jfieldID jfield_numberId = env->GetFieldID(clazz,"a", "I"); //获得这个实例的a实例变量

jint jfield_value = env->GetIntField(jobj,jfield_numberId); //获得这个实例的a实例变量的值

cout << jfield_value << endl;//打印这个实例的a实例变量的值

}

5.编译这个vc的工程,生成一个dll文件

6.在我的电脑属性里面设置环境变量path增加这个dll的目录,因为java需要从path变量找到这个dll的目录

7.打开eclipse,编写调用的main函数代码

public class NativeDemo {

public static native void say(); //static的native方法

public native void sayHello(); //实例的native方法,两者的处理不一样

public static int number = 10;

int a = 2;

public void callThis(){

System.out.println("c++ call java method");

}

public static void main(String[] args) {

System.loadLibrary("NativeJni");

// NativeDemo.sayHello();

new NativeDemo().sayHello();

say();

}

}

执行这个main函数,结果如下

在java中需要使用System.loadLibrary("NativeJni");加载vc工程生成的dll文件,这里dll后缀不能加。

java jni 调用_java jni调用过程分析相关推荐

  1. java 静态链接_java如何调用静态链接库里面的函数?

    我现在有静态链接库文件:libtest.a里面有很多.o目标文件,其中一个目标文件在linux下使用nm命令查看其中包含的部分函数:kmer_counter.o:UA_memcpyU__cxa_ate ...

  2. java 调用jni方法_Java JNI 本地方法调用Java对象方法

    // c 代码 /// /************************************** Util.h **************************************/ # ...

  3. java jni开发_Java JNI开发实践记录

    当使用到JNI的时候,基本可以肯定Java的平台移植性注定减弱,接下来记录一次使用Java JNI开发的经历. 关于Java JNI的相关资料参见: 下面是使用JNI常见三种场景: 1.在Java应用 ...

  4. 另一个.java文件调用_java - 如何调用另一个类“写文件”的方法? - SO中文参考 - www.soinside.com...

    在我的Android应用程序,我想有一类处理所有"写入/读取到文本文件"的行动.所以,我根本就调用我的readUserFile.java文件我想的方法.但我的方法将不会在该文件中工 ...

  5. java多递归调用_java – 递归调用方法

    我无法绕过递归,更具体地说是我的教科书中提供的语法.它看起来像这样: public int sum (int num) { int result; if (num == 1) result =1; e ...

  6. java servlet 数据库_Java Servlet调用数据库复习

    首先要导入jar包. 剩下的基本就是模版式的代码了: public class main { // JDBC 驱动名及数据库 URL static final String JDBC_DRIVER = ...

  7. java hive查询_java程序调用hive查询的一个异常

    最近在java程序中调用hive做查询时,碰到一个异常,被困扰了许久,经过几番调试,逐步把问题定位清楚. 在异常描述前先给出异常信息:java.sql.SQLException: Error whil ...

  8. java 方法绑定_java 方法调用绑定

    将一个方法调用同一个方法主体关联起来被称为绑定. 若在程序执行前期进行绑定(如果有的话,由编译器和连接程序实现),叫做前期绑定. 当编译器只有一个引用时,它无法知道究竟调用哪个方法才对,解决的办法就是 ...

  9. java js方法_java如何调用js方法

    详细内容 js方法如下:function add(a,b){ return a + b + number; } 调用方法如下:(免费学习视频教程分享:java视频教程)package com.cgnb ...

  10. java 反射调用_java反射调用方法

    使用參数 args 在 obj 上指派该对象所表示方法的结果 3:hello world!级别的反射调用: package com.dao.Text; import java.lang.reflect ...

最新文章

  1. Microbiome:根系分泌物驱动土壤记忆抵御植物病原菌(作者解读)
  2. js中new实例化对象内部过程
  3. c++用什么软件编程_为什么要学习“C”编程语言?
  4. linux buffer cache 过高_怎么理解内存中的Buffer和Cache?
  5. Centos下磁盘管理
  6. Java 如何判定当前时间是否在某个范围
  7. 怎么用html制作求职登记表,有步骤的编写个人简历 其效果更好
  8. [NOIP2016 普及组] 海港
  9. .gitignore释疑
  10. EasyTalking微博系统
  11. 【NanoPi2试用体验】nanopi2下的二维码识别
  12. 分布式与集群的区别,一致性hash,hadoop与HBASE,消息,关于分布式系统的数据一致性问题(来自公众号:360doc个人图书馆)
  13. IT十年人生过客-二十四-转型互联网
  14. LeaRun .Net Core/Java工作流引擎,分离式前端,升级Vue
  15. iphone12绿色好看 ,相比被全民吐槽的蓝色,绿色是怎么做到零差评的
  16. 彻底弄懂base64的编码与解码原理
  17. NGUI之UITable
  18. oracle账户locked, login denied解决办法
  19. 从m个中选n数php语言,18-从n个数中选m个
  20. 2022年T电梯修理考试技巧及T电梯修理证考试

热门文章

  1. ps景观平面图转鸟瞰图_小清新ps做景观鸟瞰图
  2. js获取浏览器高度 宽度
  3. android直播刷礼物特效,Android直播送礼物发消息页面(仿印客直播)
  4. 计算机excel函数试题,2014职称计算机考试Excel试题函数练习题
  5. 【UCOSIII操作系统】任务篇(2)相关API函数
  6. 利用JS实现简单的注册界面验证小案例
  7. pdf文档安全权限去除
  8. 清除/收缩SQL Server数据库日志
  9. 服务器------sz命令 – 从Linux上下载文件到本地
  10. Steam游戏上架五:U3D连接Steamworks SDK制作成就系统