я использовал javah
для создания нативной функции JNI:Android не в состоянии найти мою JNI родную функцию библиотеки
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_ttm_zpay_zPayTestTool */
#ifndef _Included_com_ttm_zpay_zPayTestTool
#define _Included_com_ttm_zpay_zPayTestTool
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_ttm_zpay_zPayTestTool
* Method: KiziStartTransaction
* Signature:()[B
*/
JNIEXPORT jbyteArray JNICALL Java_com_ttm_zpay_zPayTestTool_KiziStartTransaction
(JNIEnv * env, jobject)
{
return env->NewByteArray(10);
}
#ifdef __cplusplus
}
#endif
#endif
Для следующего класса Java:
package com.ttm.zpay;
public class zPayTestTool
{
public native byte[] KiziStartTransaction();
}
Я проверил, что нативная функция успешно скомпилирован в мой окончательный файл * .so, упакованный с моим APK. Я сделал это с помощью readelf -Ws lib.so
(readelf обеспечивается НДК):
5: 0015fa15 10 FUNC GLOBAL DEFAULT 8 Java_com_ttm_zpay_zPayTestTool_KiziStartTransaction
В выходе LogCat, я получаю следующее:
01-17 01:06:02.306 7017 7017 W dalvikvm: No implementation found for native Lcom/ttm/zpay/zPayTestTool;.KiziStartTransaction:()[B
01-17 01:06:02.306 7017 7017 D AndroidRuntime: Shutting down VM
01-17 01:06:02.311 7017 7017 W dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x40ccd930)
01-17 01:06:02.316 3556 3758 D AudioHardware: openPcmOut_l() mPcmOpenCnt: 0
01-17 01:06:02.321 7017 7017 E AndroidRuntime: FATAL EXCEPTION: main
01-17 01:06:02.321 7017 7017 E AndroidRuntime: java.lang.UnsatisfiedLinkError: Native method not found: com.ttm.zpay.zPayTestTool.KiziStartTransaction:()[B
01-17 01:06:02.321 7017 7017 E AndroidRuntime: at com.ttm.zpay.zPayTestTool.KiziStartTransaction(Native Method)
01-17 01:06:02.321 7017 7017 E AndroidRuntime: at com.ttm.zpay.zPayActivity.OnKiziStartTransaction(zPayActivity.java:97)
01-17 01:06:02.321 7017 7017 E AndroidRuntime: at com.ttm.zpay.zPayActivity.access$1(zPayActivity.java:95)
01-17 01:06:02.321 7017 7017 E AndroidRuntime: at com.ttm.zpay.zPayActivity$1.onClick(zPayActivity.java:90)
01-17 01:06:02.321 7017 7017 E AndroidRuntime: at android.view.View.performClick(View.java:4204)
01-17 01:06:02.321 7017 7017 E AndroidRuntime: at android.view.View$PerformClick.run(View.java:17355)
01-17 01:06:02.321 7017 7017 E AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:725)
01-17 01:06:02.321 7017 7017 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:92)
01-17 01:06:02.321 7017 7017 E AndroidRuntime: at android.os.Looper.loop(Looper.java:137)
01-17 01:06:02.321 7017 7017 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5041)
01-17 01:06:02.321 7017 7017 E AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method)
01-17 01:06:02.321 7017 7017 E AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:511)
01-17 01:06:02.321 7017 7017 E AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-17 01:06:02.321 7017 7017 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-17 01:06:02.321 7017 7017 E AndroidRuntime: at dalvik.system.NativeStart.main(Native Method)
01-17 01:06:02.331 3837 3848 W ActivityManager: Force finishing activity com.ttm.zpay/.zPayActivity
Что еще более странно, это у меня уже есть еще один нативный метод в эта библиотека использует одно и то же соглашение об именах, но для другого класса java, который отлично работает. Это только одна проблема, которая вызывает проблемы.
См. Код действующей функции JNI ниже.
Java:
package com.ttm.zpay;
public class zPayService extends Service
{
public native boolean Initialize();
}
C++:
extern "C"
{
JNIEXPORT bool JNICALL Java_com_ttm_zpay_zPayService_Initialize(JNIEnv* env, jobject obj)
{
// Do stuff
}
}
Так в конце дня: Native методов отображенных для моего zPayTestTool
класса Java не работы, но один нативный метод сопоставляется до zPayService
класс java отлично работает.
Что я делаю неправильно? Это проблема с моим AndroidManifest.xml? На данный момент у меня нет идей, и результаты в Google и другие, казалось бы, повторяющиеся вопросы о SO не помогают.
Где вызова метода Initialize? –
Вызов инициализации из 'zPayService.onCreate()'. Вызов функции 'zPayTestTool.KiziStartTransaction()' из onClickListener в моем классе активности ('public class zPayActivity extends Activity') –
В этом конкретном случае у меня есть Служба и действие, которые создаются (' onCreate').Методы JNI, вызванные из Activity, не работают, тот, который вызывается в Сервисе, работает. –