2017-01-17 12 views
0

я использовал 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 не помогают.

+0

Где вызова метода Initialize? –

+0

Вызов инициализации из 'zPayService.onCreate()'. Вызов функции 'zPayTestTool.KiziStartTransaction()' из onClickListener в моем классе активности ('public class zPayActivity extends Activity') –

+0

В этом конкретном случае у меня есть Служба и действие, которые создаются (' onCreate').Методы JNI, вызванные из Activity, не работают, тот, который вызывается в Сервисе, работает. –

ответ

0

Я понял, в чем проблема. В моей AndroidManifest.xml, я имел атрибут process установить на мой <service> элемент, но не <application>:

<application 
    android:name="com.ttm.zpay.zPayApplication" 
    android:allowBackup="true" 
    android:label="@string/app_name" 
    android:persistent="true" > 

    <service 
     android:name="com.ttm.zpay.zPayService" 
     android:exported="true" 
     android:process="com.ttm.zPayService" > 
    </service> 

    <activity 
     android:name="com.ttm.zpay.zPayActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </activity> 
</application> 

По какой-то причине, это вызывает какие-либо методы JNI, определенные в классе деятельности или классов, которые он использует, чтобы не работать. Я переехал атрибут process в <application> и, кажется, работает в настоящее время:

<application 
    android:name="com.ttm.zpay.zPayApplication" 
    android:allowBackup="true" 
    android:label="@string/app_name" 
    android:persistent="true" 
    android:process="com.ttm.zPayService"> 

    <service 
     android:name="com.ttm.zpay.zPayService" 
     android:exported="true"> 
    </service> 

    <activity 
     android:name="com.ttm.zpay.zPayActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </activity> 
</application> 
0

вам нужно добавить это в build.gradle

externalNativeBuild { 
     ndkBuild { 
      path '<path to you android.mk file>' 
     } 
} 

ИЛИ

Вы можете щелкнуть правой кнопкой на папке приложения в панели проекта, который находится на правой стороне андроида студии перейти к выбору Код ссылки c/C++ в ваш проект

+0

Я использую муравей, а не град. –