macOS下Jni调用

macOS下Jni调用

1. 声明native方法

package com.chenzhichang;

public class TestJni {
	
	static {
		System.setProperty("java.library.path", ".");
		System.loadLibrary("macjni");
	}
	public static void main(String[] args) {
		System.out.println(getStringFromC());
	}
	
	public static native String getStringFromC();
}

2. 生成头文件

2.1 使用javah命令生成头文件

javah com.chenzhichang.TestJni

生成的头文件内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include 
/* Header for class com_chenzhichang_TestJni */

#ifndef _Included_com_chenzhichang_TestJni
#define _Included_com_chenzhichang_TestJni
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_chenzhichang_TestJni
 * Method:    getStringFromC
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_chenzhichang_TestJni_getStringFromC
  (JNIEnv *env, jclass jcls);

#ifdef __cplusplus
}
#endif
#endif

从头文件的内容可以看出,生成的头文件需要依赖一个名为jni.h的头文件。该头文件位于/System/Library/Frameworks/JavaVM.framework/Headers目录下。

3. 实现native方法

#include "com_chenzhichang_TestJni.h"

JNIEXPORT jstring JNICALL Java_com_chenzhichang_TestJni_getStringFromC
  (JNIEnv *env, jclass jcls){
      return (*env)->NewStringUTF(env, "C string");
}

4. 生成动态库

4.1 使用gcc命令生成动态库

gcc -dynamiclib -I /System/Library/Frameworks/JavaVM.framework/Headers main.c -o libmacjni.jnilib
  1. -dynamiclib选项指定要生成动态库
  2. -I选项指定需要依赖的文件路径
  3. -o选项指定生成的文件名:macOs下的Jni动态链接库的后缀名为.jnilib,前缀名为lib;Windows下为.dll,无前缀;Linux下为.so,前缀名为lib。
  4. 我们在使用System.loadLibrary()方法去加载动态链接库时,应该去掉前缀名和后缀名,例如libmacjni.jnilib->macjni。

你可能感兴趣的:(macOS下Jni调用)