Frage Was ist der richtige Weg, um native Methodensignaturen in Android NDK zu schreiben?


Ich habe eine funktionierende Implementierung der NDK-Bibliothek und der entsprechenden Java-Klasse. Aber ich kann dieser Klasse keine überladene Methode hinzufügen. Derzeit enthält meine Klasse:

package com.package;

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

Meine jniwrappers.cpp-Datei hat die folgende Deklaration:

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

Bis zu diesem Punkt funktioniert alles gut. Aber als nächstes ändere ich meine Klasse:

package com.package;

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

Und zu jniwrappers.cpp eine weitere Deklaration hinzufügen:

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

Es kompiliert gut, Android-Anwendung startet, erhält nicht UnbefriedigterLinkError, aber wenn es die zweite Methode mit dem Argument aufruft, wird die erste C ++ - Funktion aufgerufen, aber nicht die zweite. Ich habe andere Methoden mit Argumenten in dieser Klasse, aber keine von ihnen ist überladen, so dass ihre jeweiligen JNI-Signaturen keine Argumente enthalten.

Also, was mache ich falsch?


19
2017-10-27 08:37


Ursprung


Antworten:


Sie müssen ein hinzufügen __ auf das Ende der ursprünglichen getFileName-Funktion, die jetzt überladen ist. Ihre 2 C-Funktionsprototypen sollten jetzt so aussehen:

JNIEXPORT jstring JNICALL Java_com_package_MyClass_getFileName__
  (JNIEnv *, jclass);

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

20
2017-10-27 15:10



Du solltest benutzen javah Werkzeug, um diese Signaturen zu generieren.

Um es zu verwenden, erstellen Sie die Klassendatei, wo Sie Ihre haben native Funktion. Du bekommst ein class Datei.

Lauf javah -jni com.organisation.class_with_native_func, es wird eine Header-Datei für Sie generieren.

Es ist viel sauberer, als es selbst zu bearbeiten.


25
2017-11-02 06:16