Mac 上 jni 编译

java.class 文件生成.h头文件

注意需要在项目根目录执行
-classpath class路径 -d 输入目录
-jni 后面的class 文件需要带上包名

javah -classpath /Users/zhengzhuoxing/Desktop/androidScpace/JavaDemo/src -d /Users/zhengzhuoxing/Desktop/androidScpace/JavaDemo/src/jni -jni jni.JniTest

cpp文件 编译为 so

g++ -shared -o libjni-test.so test.cpp -I /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers

-shared 是一个编译选项,用于将 C/C++ 源代码编译成动态链接库(。so文件)。这个选项告诉编译器生成一个共享库,而不是一个可执行文件。

-o 是一个链接选项,用于指定输出文件的名称。它告诉链接器将多个目标文件合并成一个文件,并将其命名为指定的名称。

-I 是指定jin.h的路径

java 加载so

public class JniTest {
    static {
		// System.loadLibrary("jni-test");
		// 直接从固定位置加载
        System.load(JniTest.class.getResource(File.separator).getPath()+"libjni-test.so");
    }

    public static void main(String[] args) {
        JniTest jniTest = new JniTest();
        System.out.println(jniTest.get());
        jniTest.set("hello world");
    }

    public native String get();
    public native void set(String str);
}

ystem.loadLibrary 和 System.load 是Java中用于加载本地库(Native Library)的方法。它们之间的区别如下:

  1. System.loadLibrary 方法:
  • 用于加载在系统中预先安装的本地库。
  • 需要提供本地库的名称,该名称是库文件的基本名称,不包括文件扩展名。
  • 系统会在默认的本地库搜索路径中查找并加载该库文件。
  • 例如,`System.loadLibrary(“mylibrary”) 会尝试加载名为 libmylibrary.so (在Linux/Unix系统上)或 mylibrary.dll (在Windows系统上)的本地库。
  1. System.load 方法:
  • 用于加载指定路径下的本地库。
  • 需要提供本地库文件的完整路径,包括文件名和扩展名。
  • 开发者需要确保提供的路径是正确的,并且具有读取权限。
  • 例如, System.load(“/path/to/mylibrary.so”) 会加载指定路径下的 mylibrary.so 本地库文件。
    总结:
    System.loadLibrary 用于加载预先安装的本地库,而 System.load`用于加载指定路径下的本地库。在使用这些方法时,请确保提供正确的本地库名称或路径,并注意库文件的可用性和权限。

你可能感兴趣的:(macos,jni)