zoukankan      html  css  js  c++  java
  • 用Java调用C语言代码实例(JNI)

    为初步理解Java中native本地方法的使用,提出使用native方法实现计算任意正整数二进制的需求(native方法是Java中的本地方法,一般采用C/C++通过JNI(Java native interface)实现)。

    JNI编写流程:

    1.编写带有native声明的方法的java类
    2.使用javac命令编译所编写的java类
    3.然后使用javah + java类名生成扩展名为h的头文件
    4.使用C/C++实现本地方法
    5.将C/C++编写的文件生成动态连接库
    6.运行java工程并调用JNI

    1. Java编写测试代码:

    public class Domain
    {
    	public static void main(String [] args){
    		System.loadLibrary("Counter"); //Counter为C/C++编写的动态链接库
    		Tools.binaryCount(100);
    	}
    }
    
    

    2.编写带有native声明的方法的java类

    public class Tools
    {
    	protected static native void binaryCount(int num);
    }
    
    
    使用javac Tools.java编译为Tools.class文件

    3.通过javah -jni Tools生成Tools.h文件



    点击查看Tools.h文件

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class Tools */
    
    #ifndef _Included_Tools
    #define _Included_Tools
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     Tools
     * Method:    binaryCount
     * Signature: (I)V
     */
    JNIEXPORT void JNICALL Java_Tools_binaryCount
      (JNIEnv *, jclass, jint);//需要实现的方法名
    
    #ifdef __cplusplus
    }
    #endif
    #endif
    
    

    4.打开DevC++,新建dll类型的C语言实现的项目Counter(删除项目自带的两个文件)

    5.使用C/C++实现本地方法

    #include <windows.h> 
    #include <stdlib.h>  
    #include <stdio.h>  
    #include "Tools.h" 
    #include "stack.h"
    #include "stack.c" 
    
    
    JNIEXPORT void JNICALL Java_Tools_binaryCount(JNIEnv *env, jclass obj, jint i) 
    {               
    	struct stack *s=NULL;
    	s=stack_init();
    
    	int k;
    
    	while(i>0){
    		k=i%2;
    		stack_push(s,k);
    		i=i/2;	
    	}
    	
    	printf("The binary of the %d is:",i);
    	while(!stack_isempty(s)){
    		printf("%d ",stack_pop(s));
    	}
    	stack_free(s);
    
    	return;
    }
    
    

    6.将C/C++编写的文件生成动态连接库

    右键项目->项目属性->文件/目录->包含文件目录 将JDK下include目录和include目录下的win32文件添加

    编译Counter项目

    7.运行Java项目并调用JNI

  • 相关阅读:
    xgboost中XGBClassifier()参数详解
    xgboost使用经验总结
    特征选择之Chi卡方检验
    ldd 查看程序依赖库
    paddle——docker实践
    paddle实践
    java常用设计模式
    Java内存模型
    什么是线程?
    MySQL数据库提供了那些函数?
  • 原文地址:https://www.cnblogs.com/miaowulj/p/14738956.html
Copyright © 2011-2022 走看看