JavaInterview JavaInterview
首页
指南
分类
标签
归档
  • CSDN (opens new window)
  • 文档集合 (opens new window)
  • 系统架构 (opens new window)
  • 微信号 (opens new window)
  • 公众号 (opens new window)

『Java面试+Java学习』
首页
指南
分类
标签
归档
  • CSDN (opens new window)
  • 文档集合 (opens new window)
  • 系统架构 (opens new window)
  • 微信号 (opens new window)
  • 公众号 (opens new window)
  • 指南
  • 简历

  • Java

  • 面试

  • 算法

  • sourcecode
  • bottom
JavaInterview.cn
2022-04-30
目录

Java编写原生方法Java

文章发布较早,内容可能过时,阅读注意甄别。

# 原生方法

代码坐标

<dependency>
    <groupId>cn.javainterview</groupId>
    <artifactId>javainterview-core</artifactId>
    <version>1.0.8</version>
</dependency>
1
2
3
4
5

例子: cn.javainterview.core.jni.JavaInterviewJNI.print,输入字符串,打印字符串

  1. 编写cn.javainterview.core.jni.JavaInterviewJNI类
package cn.javainterview.core.jni;

/**
 * @author JavaInterview
 * @email 1091938307@qq.com
 * @created 2022-04-30
 * @timed 21:22
 */
public class JavaInterviewJNI {

    public native void print(String i);

    static {
        System.loadLibrary("javainterview");
        //需求生成的动态链接库名字(linux下为libjavainterview.so)
        //需求生成的动态链接库名字(mac下为libjavainterview.jnilib)

    }


    public static void main(String[] args) {
        //输出的值是以:分隔的,区分多个路径,生成的libjavainterview.jnilib文件放在任意一个路径下就行
        System.out.println("java.library.path=" + System.getProperty("java.library.path")); 

        JavaInterviewJNI javaInterviewJNI = new JavaInterviewJNI();
        javaInterviewJNI.print("Hello JavaInterview !!!");
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
  1. 编译cn.javainterview.core.jni.JavaInterviewJNI.java文件
javac cn.javainterview.core.jni.JavaInterviewJNI.java
1

生成cn.javainterview.core.jni.JavaInterviewJNI.class文件

注意 .java文件和.class不要放在同一个目录下,可以把.class文件放在cn.javainterview.core.jni.compile文件下

  1. 执行javah cn.javainterview.core.jni.JavaInterviewJNI命令生成cn.javainterview.core.jni.JavaInterviewJNI.h文件
javah -classpath /Users/javainterview/ownprojects/JavaInterview/javainterview-core/src/main/java cn.javainterview.core.jni.JavaInterviewJNI

1
2
  1. 编写cn_javainterview_core_jni_JavaInterviewJNI.cpp文件
#include<stdio.h>
#include<stdlib.h>
#include<iostream>//预处理
#include<string> //引入string
using namespace std;//命名空间


#include "cn_javainterview_core_jni_JavaInterviewJNI.h"
std::string jstring2str(JNIEnv* env, jstring jstr)
{
    char*   rtn   =   NULL;
    jclass   clsstring   =   env->FindClass("java/lang/String");
    jstring   strencode   =   env->NewStringUTF("UTF-8");
    jmethodID   mid   =   env->GetMethodID(clsstring,   "getBytes",   "(Ljava/lang/String;)[B");
    jbyteArray   barr=   (jbyteArray)env->CallObjectMethod(jstr,mid,strencode);
    jsize   alen   =   env->GetArrayLength(barr);
    jbyte*   ba   =   env->GetByteArrayElements(barr,JNI_FALSE);
    if(alen   >   0)
    {
        rtn   =   (char*)malloc(alen+1);
        memcpy(rtn,ba,alen);
        rtn[alen]=0;
    }
    env->ReleaseByteArrayElements(barr,ba,0);
    std::string stemp(rtn);
    free(rtn);
    return   stemp;
}

JNIEXPORT void JNICALL Java_cn_javainterview_core_jni_JavaInterviewJNI_print
  (JNIEnv* env, jobject, jstring i)
{
      std::string input = jstring2str(env,i);
      printf("%s",input.c_str());

}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
  1. 生成jnilib文件
g++ -shared -o libjavainterview.jnilib cn_javainterview_core_jni_JavaInterviewJNI.cpp  -I${JAVA_HOME}/include -I${JAVA_HOME}/include/darwin
1
  1. 把libjavainterview.jnilib放在系统java.library.path目录下让虚拟机加载

  2. 执行JavaInterviewJNI.java的mian方法,输出

Hello JavaInterview !!!
1

设置成功

微信 支付宝
#Java#原生方法
最近更新
01
1601. 最多可达成的换楼请求数目 Java
06-09
02
1625. 执行操作后字典序最小的字符串 Java
06-09
03
1627. 带阈值的图连通性 Java
06-09
更多文章>
Theme by Vdoing | Copyright © 2019-2025 JavaInterview.cn
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式