2016-05-14 2 views
2

У меня есть функция JNI, которая передает android.graphics.Bitmap$Config в качестве аргумента. Config - внутренний класс Bitmap. Когда я бегу javah я получаю неверная подпись заголовка (усечения, чтобы только один аргумент):JNI: javah управляет аргументами, которые являются внутренними классами

Landroid_graphics_Bitmap_Config 

, который является эквивалентом:

Landroid/graphics/Bitmap/Config 

вместо:

Landroid_graphics_Bitmap_00024Config 

который является эквивалентом

Landroid/graphics/Bitmap$Config 

То, что генерирует javah, неверно, поскольку JNI выдает ошибку для поиска _00024 представления $ для внутреннего класса. Мужчина для javah, похоже, не предполагает каких-либо настроек для исправления этого. Это просто ограничение javah?

+0

Зачем JNI искать представление 0024, если javah его не генерирует? – EJP

+0

См. Https://bugs.openjdk.java.net/browse/JDK-8145897 –

+0

@EJP Ошибка в загрузке библиотеки в Android Studio, в которой определено, что она ищет подпись 00024, которой у меня не было Я использовал его непосредственно из джавы. Я предполагаю, что это ошибка Java, поэтому его странно, что javah не генерирует правильную подпись. Сообщение об ошибке - это то, что действительно послало меня на эту дикую охоту на гусей. В противном случае я бы понятия не имел о 00024/$. – Anthony

ответ

1

Похоже, что имеется ошибка (или несогласованность) в JDK, когда задействованы параметры внутреннего типа класса.

Вот класс образец, который воспроизводит проблему:

public class A { 

    public native void a(android.graphics.Bitmap.Config b); 
    public native void a(android.graphics.Bitmap.Config b, int c); 
    static { 
     System.loadLibrary("hello-libs"); 
     a(null); 
    } 
} 

Если вы используете javah генерировать родной заголовок, вы получите

/* DO NOT EDIT THIS FILE - it is machine generated */ 
#include <jni.h> 
/* Header for class com_example_hellolibs_MainActivity */ 

#ifndef _Included_com_example_hellolibs_MainActivity 
#define _Included_com_example_hellolibs_MainActivity 
#ifdef __cplusplus 
extern "C" { 
#endif 
/* 
* Class:  A 
* Method: a 
* Signature: (Landroid/graphics/Bitmap/Config;)V 
*/ 
JNIEXPORT void JNICALL A_a__Landroid_graphics_Bitmap_Config_2 
    (JNIEnv *, jobject, jobject); 

/* 
* Class:  A 
* Method: a 
* Signature: (Landroid/graphics/Bitmap/Config;I)V 
*/ 
JNIEXPORT void JNICALL Java_A_a__Landroid_graphics_Bitmap_Config_2I 
    (JNIEnv *, jobject, jobject, jint); 

#ifdef __cplusplus 
} 
#endif 
#endif 

и -

java.lang.UnsatisfiedLinkError: No implementation found for void A.a(android.graphics.Bitmap$Config) (tried Java_A_a and Java_A_a__Landroid_graphics_Bitmap_00024Config_2)

Но эта ошибка редко влияет на заголовки, генерируемые javah или javac -h dir, потому что обычно собственные методы генерируются с «короткими» именами, например. Java_A_a, который не заботится о типе параметра.

Решение состоит в том, чтобы вручную изменить сигнатуры метода, как предложено в https://bugs.openjdk.java.net/browse/JDK-8145897.

 Смежные вопросы

  • Нет связанных вопросов^_^