JNI开发系列④C语言调用构造方法

接续上篇JNI开发系列③C语言调用Java字段与方法

前情提要

Java调用C方法很简单 , 只需要编写native方法即可 , 通过C去调用Java的字段与方法 , 则需要比较复杂的操作 , 上篇中介绍了 , C调用的Java字段与方法的几个套路:

步骤一 、 得到jclass, 字节码对象 , 如果是static native修饰 , 则函数会以jclass类型传入 , 非静态则需要得到jclass类型 。

步骤二 、得到字段或方法ID , 区分静态字段与对象字段 , 静态字段或方法调用(env)->GetStaticFieldID,(env)->GetMethodID函数得到ID , 对象字段调用(env)->GetFieldID,(env)->GetStaticMethodID得到ID 。 可以得到一个套路 , 静态修饰的 , 则调用static标识的函数 , 非静态的则调用常规函数 。

步骤三 、 取得字段的值或调用方法 , 需要注意的是, 得到字段的值与调用方法 , 都有类型的区分 。引用类型则使用GetObjectField, CallStaticObjectMethod, 其他类型 , 则有对于的jxxx类型对应 。套路简写:Get<Type>Field, GetStatic<Type>Field, Call<Typ

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
调用一个JNI方法,需要遵循以下步骤: 1. 在Java代码中声明native方法。 2. 使用javac编译Java代码,生成类文件。 3. 使用javah工具生成头文件,该头文件包含JNI方法的声明和C/C++语言函数的实现。 4. 编写C/C++代码实现JNI方法。 5. 使用gcc或其他C/C++编译器编译C/C++代码,生成动态库文件。 6. 在Java代码中调用JNI方法,使用System.loadLibrary加载动态库文件。 7. 调用JNI方法。 下面是一个示例: 在Java代码中声明native方法: ``` public class NativeTest { public native void printHello(); } ``` 使用javac编译Java代码: ``` javac NativeTest.java ``` 使用javah工具生成头文件: ``` javah NativeTest ``` 生成的头文件NativeTest.h中包含了JNI方法的声明: ``` /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class NativeTest */ #ifndef _Included_NativeTest #define _Included_NativeTest #ifdef __cplusplus extern "C" { #endif /* * Class: NativeTest * Method: printHello * Signature: ()V */ JNIEXPORT void JNICALL Java_NativeTest_printHello (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif ``` 编写C/C++代码实现JNI方法: ``` #include <stdio.h> #include "NativeTest.h" JNIEXPORT void JNICALL Java_NativeTest_printHello(JNIEnv * env, jobject obj) { printf("Hello from JNI!\n"); } ``` 使用gcc编译C/C++代码,生成动态库文件: ``` gcc -shared -o libnative.so NativeTest.c -I<path-to-JDK-include> -I<path-to-JDK-include>/linux ``` 在Java代码中调用JNI方法: ``` System.loadLibrary("native"); NativeTest test = new NativeTest(); test.printHello(); ``` 运行Java代码,输出结果为: ``` Hello from JNI! ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值