2015-03-13 84 views
2

標題說明了一切。我正在使用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上運行的事實讓我覺得它可能與構建配置或類似的東西有關,但我無法弄清楚它是什麼。有任何想法嗎?謝謝。

回答

1

我發現建築經過大量的試驗和錯誤之後,出錯的原因是Android以某種方式設法搞砸了圖書館的依賴關係。解決方法是使用LoadLibrary以特定的依賴關係順序手動加載庫。這可以在Unity中使用AndroidJavaClass完成,以避免爲了加載本地代碼而編寫整個jar庫。

0

您必須構建與您正在使用的設備的體系結構相對應的.so。 你應該看看這個鏈接: https://developer.nvidia.com/AndroidWorks 它提供了有用的工具,在Android上開發的Visual Studio 您可以輕鬆地配置一個Android動態庫(的.so)對應於您需要:)

+0

呃,實際上,它並不是那樣的,因爲Unity當時還沒有支持除ARM7之外的其他任何東西。原因見我自己的回答。 – Arshia001 2015-06-11 19:36:17