|
一、简介 Java Native Interface(JNI),java与c/c++交互的接口,下面是一个简单是示例。
javah 可以生成native方法对应的头文件,javap 可以查看方法或者属性的签名。
二、示例 1、书写带native的java代码
- package com.jni;
- import java.util.Date;
- //javah com.jni.Hello
- //com_jni_Hello.h
- public class Hello {
- public int property;
- //javap -s com.jni.Hello
- //(ILjava/util/Date;[I)I
- public int function ( int foo,Date date, int[] arr){
- System.out.println(foo+ "="+date+ ""+arr);
- return 0;
- }
- public native void hello ();
- public static void main (String[] args) {
- System.loadLibrary( "nativeCode");
- Hello hl = new Hello();
- hl.hello();
- }
- }
|
2、通过javah生成头文件com_jni_Hello.h
3、通过javap查看方法和属性签名
4、在vc或者vs中新建DLL工程(工程名为vativeCode),加入生成的头文件到工程中,如果有缺失的依赖头文件,到jdk目录(%java_home%\include)下找到,一起加入工程
5、书写C/C++代码(.cpp文件中)
- # include "com_jni_Hello.h"
- # include <iostream>
- using namespace std;
- JNIEXPORT void JNICALL Java_com_jni_Hello_hello (JNIEnv * env, jobject obj)
- {
- cout<< "hello native"<< endl; //
- jclass hello_clazz = env->GetObjectClass(obj); //获取class
- jfieldID field_prop = env -> GetFieldID(hello_clazz, "property", "I"); //通过属性名和签名获取属性
- jmethodID methodId_func = env->GetMethodID(hello_clazz, "function", "(ILjava/util/Date;[I)I"); //获取方法
- env->CallIntMethod(obj,methodId_func, 0L, NULL, NULL); //执行
- }
|
6、运行DLL工程生成dll文件(nativeCode.dll)配置dll文件到环境变量中
7、运行java代码
----------------------------
原文链接:https://blog.csdn.net/sand_ant/article/details/11742439
程序猿的技术大观园:www.javathinker.net
[这个贴子最后由 flybird 在 2020-02-06 21:00:28 重新编辑]
|
|