zoukankan      html  css  js  c++  java
  • Java native编程

    Java native 编程(环境jdk8 + winowsx64 + vc2017/MinGW)

    最近看到一个关于Java 线程创建的底层实现是通过native方法调用c++/系统函数,所以想搞一下java native

    Java native方法编写

    • TestNative.java
    public class TestNative {
        static {
    //        System.loadLibrary("TestNative");
            System.load("D:\workspace\C++\TestNative\x64\Debug\TestNative.dll");
        }
    
        public native static void test();
    
        public native static void test(String name);
    
        public native static int test(int a);
    
        public static void main(String[] args) {
            System.out.println(test(10));
            test();
            test("youlingdada");
        }
    
    }
    
    
    • HelloNative.java
    import java.util.Objects;
    
    public class HelloNative {
        static {
            System.load("D:\C++\Test\HelloNative.dll");
    //        System.out.println(System.getProperty("java.library.path"));
    //        System.loadLibrary("HelloNative");
        }
    
        public static native String sysHello(String s);
    
        public static void main(String[] args) {
            String s = sysHello("youlingdada");
            System.out.println(s);
        }
    }
    
    

    编译Java文件,并通过javah 生成对应的c/c++ 头文件

    javac TestNative.java
    javah -jni -encoding UTF-8 TestNative
    
    javac HelloNative.java
    javah -jni -encoding UTF-8 HelloNative
    
    • HelloNative.h
    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class HelloNative */
    
    #ifndef _Included_HelloNative
    #define _Included_HelloNative
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     HelloNative
     * Method:    sysHello
     * Signature: (Ljava/lang/String;)Ljava/lang/String;
     */
    JNIEXPORT jstring JNICALL Java_HelloNative_sysHello
      (JNIEnv *, jclass, jstring);
    
    #ifdef __cplusplus
    }
    #endif
    #endif
    
    

    编写c/c++实现方法

    #include <stdio.h>
    #include "pch.h"
    #include "HelloNative.h"
    
    
    JNIEXPORT jstring JNICALL Java_HelloNative_sysHello
    (JNIEnv *env, jclass jobj, jstring name) {
    	const char *s = env->GetStringUTFChars(name, 0);
    	const char *str = (*env).GetStringUTFChars(name, 0);
    	printf("name=%s
    ", str);
    	(*env).ReleaseStringUTFChars(name, str);
    	char text[] = "youlingdada@163.com";
    	return (*env).NewStringUTF(text);
    }
    

    注意点,这里我就实现HelloNative

    • System.loadLibrary(filename) 这里的filename 要放在src目录下即可
    • System.load(filepath) 绝对路径
    • c++实现的方法第二个参数必须为jclass 不能写jobject
  • 相关阅读:
    imperva_waf导入ssl证书
    博科光纤交换机初始化配置
    xss测试代码
    生成树注意事项
    [转载]Basics of the Unix Philosophy
    [转载]GSview注册码
    [转载]tar命令详解
    [转载]WinEdt 6 注册 试用期30天永不过期
    [转载+修改]计数排序
    [转载]C++ 关于声明,定义,类的定义,头文件作用,防止头文件在同一个编译单元重复引用,不具名空间
  • 原文地址:https://www.cnblogs.com/youlingdada-top/p/15150792.html
Copyright © 2011-2022 走看看