標題說明了一切。我正在使用NDK構建一個用於Unity的本地庫(遊戲引擎,而不是Ubuntu shell)。我已經有了很多代碼,它可以運行在運行Android 4.4.4的Xperia Z Ultra上。然而,最近我把應用程序發送給其他人在他們的手機上進行測試,並且它們都不在他們的手機上工作。他們使用的是Android 4.0和4.1,因此我嘗試在自己的Android 4.0.4設備(舊版Xperia Mini Pro)上運行該應用程序,並遇到同樣的問題。在縮小範圍之後,我發現問題的根源在於構建OpenCV,即使它沒有被引用。爲什麼Unity在鏈接到OpenCV時無法加載android本地庫?
這是我現在的代碼。首先,你看過的最簡單的CPP文件:
//Test.cpp:
extern "C"
{
int Test(int a, int b)
{
return a + b;
}
}
注意它甚至沒有包含任何來自OpenCV的東西。生成文件(或任何它被稱爲在NDK的背景下,我主要是一個Windows/Visual Studio的人)是:
#Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#---------------------------
#note: if I comment these lines out, the library works just fine.
#if I don't, it won't load at all.
#---------------------------
OPENCV_PACKAGE_DIR := D:\Eclipse\OpenCVAndroid\OpenCV-2.4.9-android-sdk
include $(OPENCV_PACKAGE_DIR)/sdk/native/jni/OpenCV.mk
LOCAL_MODULE := Test
LOCAL_SRC_FILES := Test.cpp
include $(BUILD_SHARED_LIBRARY)
建設這個項目給了我一個「libTest.so」文件。我把它放到了我的Unity項目中,在Assets/Plugins/Android /(我也嘗試將它放在Plugins/Android/libs/armeabi-v7a /中,沒有運氣)。我也有一個內部調用庫的腳本:
//TestNative.cs:
using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;
public class TestNative : MonoBehaviour
{
[DllImport("Test")]
public static extern int Test(int a, int b);
void OnGUI()
{
try
{
GUI.Label(new Rect(0, 0, 100, 100), "2 + 3 = " + Test(2, 3));
}
catch (System.Exception e)
{
GUI.Label(new Rect(0, 0, 600, 400), e.GetType().ToString() + " " + e.Message + "\n" + e.StackTrace);
}
}
}
當我在Z Ultra上運行它時,它工作得很好。當我在Mini Pro上運行它時,它會失敗,出現異常「DllNotFoundException:Test」。我檢查了logcat的錯誤,這就是它說的:
01-06 06:46:27.660: D/dalvikvm(11135): Trying to load lib /mnt/asec/com.cet.sna2-2/lib/libTest.so 0x2bb86638
01-06 06:46:27.660: D/dalvikvm(11135): Trying to load lib /mnt/asec/com.cet.sna2-2/lib/libTest.so 0x2bb86638
01-06 06:46:27.660: E/Unity(11135): Unable to find Test
它不說別的,它只是失敗。它在4.4.4上運行的事實讓我覺得它可能與構建配置或類似的東西有關,但我無法弄清楚它是什麼。有任何想法嗎?謝謝。
呃,實際上,它並不是那樣的,因爲Unity當時還沒有支持除ARM7之外的其他任何東西。原因見我自己的回答。 – Arshia001 2015-06-11 19:36:17