AndroidNDK JNI中调用java方法
admin
2024-02-14 16:45:14
0

这次在做NDK开发的时候,有需求需要在JNI直接调用和获取Java中的方法和变量,比如回调,系统信息参数等…
在JNI中调用Java方法,就需要使用FindClassGetMethodID这两个类

使用FindClass和GetMethodID调用Java方法

先上一个简单调用Java方法的例子:
我们有一个数学工具类包名是com.andy.obj,里面有一个加法的静态方法和一个减法的普通方法,

import com.andy.obj;public class MathUtil {public static int add(int a, int b) {return a+b;}public int reduce(int a,int b) {return a-b;}
}

首先在JNI中可以通过FindClass可以找到Java类,得到jclass,例如:

jclass javaclass = env->FindClass("com/andy/obj/MathUtil");

FindClass的参数需要传入类的完整包名。

使用GetMethodID可以获取类的方法,得到jmethodID,例如:

jmethodID jstaticmethodIds = env->GetMethodID(javaclass, "add", "(II)I");
jmethodID jmethodIds = env->GetMethodID(javaclass, "reduce", "(II)I");

其中第四个参数是比较奇怪的字符串,这就是方法签名,现在只需要知道是设置了Java原生方法的两个int类型的参数和一个int类型的返回值,具体用法和作用后面细讲

调用Java方法

 //调用静态方法env->CallStaticObjectMethod(javaclass, jstaticmethodIds, 1,1);jobject object = env->AllocObject(jclazz);//调用普通方法env->.CallIntMethod(javaclass, jmethodIds, 1,1);

上总流程

extern "C"
JNIEXPORT void JNICALL
Java_com_andy_obj_test_add(JNIEnv *env, jobject jobj) {//得到字节码jclass javaclass = env->FindClass("com/andy/obj/MathUtil");//得到普通方法jmethodID jmethodIds = env->GetMethodID(jclazz,"reduce","(II)I");//得到静态普通方法jmethodID jstaticmethodIds = env->GetStaticMethodID(jclazz,"add","(II)I");//调用静态方法env->CallStaticObjectMethod(env, javaclass, jstaticmethodIds,1,1);//调用普通方法需要实例化jobject object = env->AllocObject(jclazz);//调用普通方法env->CallIntMethod(object,jmethodIds,100,1);
}

方法签名

GetMethodID中第四个参数()V就是方法签名,Java是支持重载的,所以需要标明方法的传参和返回值,这就是方法的签名。它是用来保证方法的唯一性。其中()代表不传参数,V代表返回值为void。
方法签名对于Java的类型都有一一对应的值。方法签名中用大写的字母对应了java的基本数据类型:

  • Z -> boolean
  • B -> byte
  • C -> char
  • S -> short
  • I -> int
  • J -> long
  • F -> float
  • D -> double

其实就是有两个比较特殊的:boolean对应的是Z,long对应的J,其他的都是首个字母的大写即可。

数组的表示方法,以[为标志,一个[标识一维数组,[[表示二维数组,例如:

  • byte[] -> [B
  • int[][] -> [[I

引用类型的表示方法,需要以L开头,以;结束,中间对应类型的包名加类名,例如:

  • String -> Ljava/lang/String;
  • Object -> Ljava/lang/Object;

自定义类的表示方法类似,比如包名为com.andy.obj,类名为MethodBean的表示方法是:

  • com.andy.obj.MethodBean ->Lcom.andy.obj.MethodBean;

相关内容

热门资讯

“茅台魔咒”失灵了?沪指站上4... 11日,沪指走出“八连阳”,站上4200点,创下自2015年6月26日以来的收盘点位新高。 板块方...
沪指涨0.94%站上4200点... 扬子晚报网5月11日讯(记者 范晓林)截至午盘,沪指站上4200点,创业板指大涨突破3900点,为2...
ETF周评:4200点之前,“... “五一”假期后的首个交易周(5月6日至5月8日),A股虽仅有短短三个交易日,却展现出强劲的做多动能。...
集智达GNS-2446主板赋能... 当前医疗自助终端面临四大行业痛点:多任务并发算力瓶颈;外设兼容集成难题;数据安全合规压力;复杂环境稳...
动荡市场中锚定稀缺确定性,新能... 3月以来,美伊冲突导致全球能源价格出现大幅波动。整体上看,本轮地缘冲突的复杂性和影响深度远超以往,加...
CFA协会:未来金融人才需具备... 由特许金融分析师协会(CFA协会)、北京市金融发展促进中心共同主办的2026第五届中国未来金融分析师...
最熟悉的“国民理财神器”,让你... 1万元放进余额宝,一天收益只有0.24元,连个鸡蛋都买不起。这不是某个冷门产品,而是那个曾创下6.7...
Circle从贝莱德等机构融资... 来源:环球市场播报 核心要点 Circle 互联网集团在其全新 Arc 区块链关联代币预售中融资...
张尧浠:美伊局势变数不断 金价... 来源:市场资讯 5月11日:黄金市场上周:国际黄金伦敦金触底回升收涨,再度收取垂线止跌看涨形态,但上...
中澳企业拓展新能源合作 来源:人民日报 2026年澳大利亚智慧能源展日前在悉尼国际会议中心举行。当前,中东局势引发全球能源...
七类技能培训“套路”曝光 中消... 记者今天(11日)从中消协获悉,近年来,各类技能培训迅速扩张,新型培训模式不断涌现,部分经营者借助新...
每日收评沪指涨超1%站上420... 财联社5月11日讯,市场全天震荡走强,沪指站上4200点,创业板指大涨突破3900点,为2015年6...
A股三大指数集体上涨:沪指站上... 观点网讯:5月11日,A股三大指数集体上涨,截至收盘,上证指数涨1.08%站上4200点,深证成指涨...
原创 这... 地方债的压力还在加大。 最近,国家及地方层面再次密集提及"化债"这一关键词,引发了社会各界的广泛...
无忧传媒与王暖暖解约,本人回应... 近日,电影《消失的她》原型、“中国孕妇泰国坠崖案”当事人王暖暖(化名)发布在医院抢救的视频,并公开控...
中国家电,没那么乐观 文|小卢鱼 编辑|杨旭然 随着三星电子的一纸公告,其电视、冰箱、洗衣机、显示器在内的品类全部在华停售...
“销量暴增850%”!银行投资... 记者在北京多家银行走访中发现,今年以来,银行销售渠道的金条销量大幅增长,黄金相关理财产品和基金的申购...