使用javah快速生成本地方法及生成so动态库文件

使用javah快速生成本地方法及生成so动态库文件


1、生成包含本地方法的.h文件

如果使用jdk1.6可以直接到bin/classess,在cmd窗口使用如:javah com.lqr.test.MainActivity 命令,即可在bin/classess目录下生成包含本地方法的.h文件。

如果使用jdk1.7及以上版本,则要到src目录下操作以上命令,会在src目录下生成包含本地方法的.h文件,原因是1.7后会检查类的关联。

2、得到本地方法:
打开生成好的.h文件,把相应的本地方法复制到自己的xxx.c文件中,注意要实现该方法,否则会报方法找不到这种错误。
报错代码如下:

Caused by: java.lang.UnsatisfiedLinkError: Native method not found: com.lqr.test.MainActivity.result_from_c:(II)I

3、到jni目录下,使用ndk-build命令即可在lib目录下生成对应处理器平台的so动态库文件。

说明:在jni中,下划线"_"表示层级结构,所以如果本地方法名尽量避免使用下划线。
如果一定要用到下划线,解决方法有:
(1)用javah直接生成对应本地方法,jdk会自动帮我们生成正确无误的方法名。
(2)简单粗暴的在方法名的每个下划线后面写上一个数字1即可,如 result_from_c 对应是 result_1from_1c
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java可以使用JNI(Java Native Interface)来调用动态库,而C语言可以编写动态库供其他程序调用。因此,你可以先使用Java编写一个类,然后使用JNI将其封装为动态库供C程序调用。 下面是一个简单的示例,假设你已经编写了一个Java类`MyClass`,其中有一个`hello()`方法: ```java public class MyClass { public static native void hello(); static { System.loadLibrary("mylibrary"); } } ``` 这里使用了`System.loadLibrary()`方法加载了名为`mylibrary`的动态库。接下来,你需要使用`javah`命令生成一个头文件,以便C程序调用Java方法: ``` javah -classpath . -jni MyClass ``` 生成的头文件`MyClass.h`中包含了`hello()`方法的声明: ```c JNIEXPORT void JNICALL Java_MyClass_hello(JNIEnv *, jclass); ``` 现在你可以使用C语言编写一个动态库,其中包含了`Java_MyClass_hello()`方法的实现: ```c #include <jni.h> #include "MyClass.h" JNIEXPORT void JNICALL Java_MyClass_hello(JNIEnv *env, jclass clazz) { printf("Hello from C!"); } ``` 编译动态库时,需要将`MyClass.h`头文件和`libjvm.so`库文件包含在编译命令中: ``` gcc -shared -fPIC -I$JAVA_HOME/include -I$JAVA_HOME/include/linux -o mylibrary.so MyClass.c -ljvm ``` 其中,`$JAVA_HOME`是Java安装路径。最后,你可以在C程序中加载并调用这个动态库: ```c #include <dlfcn.h> int main() { void *handle = dlopen("mylibrary.so", RTLD_LAZY); if (handle) { void (*hello)() = dlsym(handle, "Java_MyClass_hello"); if (hello) { (*hello)(); } dlclose(handle); } return 0; } ``` 运行C程序后,即可看到从Java类中输出的`Hello from C!`字符串。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值