栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JNI之C调用Java方法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JNI之C调用Java方法

JNI之C调用Java方法 自定义Java方法

1.自定义Java方法

// java方法
public class MyJavaClass {
    public String getName(String content) {
        return "hello world -> " + content;
    }
}

2.编译该类获取.class 文件

javac MyJavaClass.java

3.获取该类的签名

javap -p -s 包名.MyJavaClass

// 获取结果如下
警告: 二进制文件MyJavaClass包含com.barray.hellojni.MyJavaClass
Compiled from "MyJavaClass.java"
public class com.barray.hellojni.MyJavaClass {
  public com.barray.hellojni.MyJavaClass();
    descriptor: ()V
  public java.lang.String getName(java.lang.String);
    descriptor: (Ljava/lang/String;)Ljava/lang/String;
}

4.Java调用C++方法

public native void demoMethod(MyJavaClass myJavaClass);

5.C代码调用

extern "C"
JNIEXPORT void JNICALL
Java_com_barray_hellojni_MainActivity_demoMethod(JNIEnv *env, jobject thiz, jobject my_java_class) {
    // 获取当前对象的类文件
    jclass  jc = env->GetObjectClass(my_java_class);
    // 获取当前需要调用的方法id
    jmethodID methodId = env->GetMethodID(jc,"getName","(Ljava/lang/String;)Ljava/lang/String;");
    // 调用该方法
    char * content = "from C++";
    jstring j_content = env->NewStringUTF(content);
    jstring j_result = (jstring)env->CallObjectMethod(my_java_class,methodId,j_content);
    const char * c_result = env->GetStringUTFChars(j_result,JNI_FALSE);
    __android_log_print(ANDROID_LOG_INFO,"JNI_TAG","result ---> %s",c_result);
}
Android原生Java方法

以getPackageName方法为例
1.找到android.jar这个包
2.将.jar改为.zip文件
3.获取该类的签名(同上)

javap -p -s ContextWrapper


// 获取以下信息
...
  public java.lang.String getPackageName();
    descriptor: ()Ljava/lang/String;
...

java签名分析
Java类型符号标识
booleanZ
byteB
charC
shortS
intI
longJ
floatF
doubleD
voidV
对象以L开头;结尾,中间用/隔开包名及类名
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/270754.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号