在Android NDK中编写本地方法签名的正确方法是什么?

 2023-01-21    234  

问题描述

我有NDK库和相应的Java级的工作实现.但是我无法在该课程中添加超载方法.目前我的课程包含:

package com.package;

public class MyClass
{
  public static native String getFileName();
  static
  {
    System.loadLibrary("mylib");
  }
}

我的jniwrappers.cpp文件具有以下声明:

在Android NDK中编写本地方法签名的正确方法是什么?

JNIEXPORT jstring JNICALL
Java_com_package_MyClass_getFileName(_JNIEnv* env, jobject thiz);

到目前为止,一切正常.但是接下来我修改了我的课程:

package com.package;

public class MyClass
{
  public static native String getFileName();
  public static native String getFileName(int index);
  ...
}

并添加到jniwrappers.cpp另一份声明:

JNIEXPORT jstring JNICALL
Java_com_package_MyClass_getFileName__I(_JNIEnv* env, jobject thiz, jint index);

它可以编译罚款,Android应用程序开始,不会变得不舒服,但是当它调用第二种方法时,请称呼第一个C ++函数,但未调用第二个函数.我还有其他参数的方法,但它们都没有超载,因此它们各自的JNI签名不包含参数.

那么,我在做什么错?

推荐答案

您必须在原始GetFilename函数的末端添加__,因为它已被超载.您的2 C功能原型现在应该看起来像:

JNIEXPORT jstring JNICALL Java_com_package_MyClass_getFileName__
  (JNIEnv *, jclass);

JNIEXPORT jstring JNICALL Java_com_package_MyClass_getFileName__I
  (JNIEnv *, jclass, jint);

其他推荐答案

您应该使用javah工具来生成这些签名.

要使用它,构建具有native函数的类文件.您将获得class文件.

运行javah -jni com.organisation.class_with_native_func,它将为您生成标头文件.

它比自己编辑要干净得多.

以上所述是小编给大家介绍的在Android NDK中编写本地方法签名的正确方法是什么?,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/26336.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。