Java编写原生方法Java
文章发布较早,内容可能过时,阅读注意甄别。
# 原生方法
代码坐标
<dependency>
<groupId>cn.javainterview</groupId>
<artifactId>javainterview-core</artifactId>
<version>1.0.8</version>
</dependency>
1
2
3
4
5
2
3
4
5
例子: cn.javainterview.core.jni.JavaInterviewJNI.print
,输入字符串,打印字符串
- 编写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
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
- 编译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文件下
- 执行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
2
- 编写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
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
- 生成jnilib文件
g++ -shared -o libjavainterview.jnilib cn_javainterview_core_jni_JavaInterviewJNI.cpp -I${JAVA_HOME}/include -I${JAVA_HOME}/include/darwin
1
把
libjavainterview.jnilib
放在系统java.library.path
目录下让虚拟机加载执行JavaInterviewJNI.java的mian方法,输出
Hello JavaInterview !!!
1
设置成功