ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java native编程

2021-08-17 09:01:47  阅读:153  来源: 互联网

标签:Java String 编程 System static HelloNative public 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\n", 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

标签:Java,String,编程,System,static,HelloNative,public,native
来源: https://www.cnblogs.com/youlingdada-top/p/15150792.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有