簡體   English   中英

Android無法找到我的JNI本機庫函數

[英]Android not able to find my JNI native library function

我用javah生成了本機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();
}

我驗證了本機函數已成功編譯到與APK打包在一起的最終* .so文件中。 我是通過使用readelf -Ws lib.so (由NDK提供的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
    }
}

因此,在這一天結束:映射為我的本地方法zPayTestTool java類工作,而是映射到一個本地方法zPayService Java類工作正常。

我到底在做什么錯? 我的AndroidManifest.xml是否有問題? 我目前還沒有主意,在Google上獲得的結果以及在SO上似乎重復的其他問題都沒有幫助。

您需要在build.gradle中添加它

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

要么

您可以在android studio右側的項目窗格中右鍵單擊應用程序文件夾,轉到選項將c / c ++代碼鏈接到您的項目

我弄清楚了問題所在。 在我的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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM