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)的方法。它们之间的区别如下:
- System.loadLibrary 方法:
- 用于加载在系统中预先安装的本地库。
- 需要提供本地库的名称,该名称是库文件的基本名称,不包括文件扩展名。
- 系统会在默认的本地库搜索路径中查找并加载该库文件。
- 例如,`System.loadLibrary(“mylibrary”) 会尝试加载名为 libmylibrary.so (在Linux/Unix系统上)或 mylibrary.dll (在Windows系统上)的本地库。
- System.load 方法:
- 用于加载指定路径下的本地库。
- 需要提供本地库文件的完整路径,包括文件名和扩展名。
- 开发者需要确保提供的路径是正确的,并且具有读取权限。
- 例如, System.load(“/path/to/mylibrary.so”) 会加载指定路径下的 mylibrary.so 本地库文件。
总结:
System.loadLibrary 用于加载预先安装的本地库,而 System.load`用于加载指定路径下的本地库。在使用这些方法时,请确保提供正确的本地库名称或路径,并注意库文件的可用性和权限。
NDK 编译so
在main目录下执行
/Users/zhengzhuoxing/Library/Android/sdk/ndk/25.1.8937393/ndk-build