2013-01-23 4 views
0

Je vais avoir un problème similaire à ce que cette personne était d'avoir:Android méthode de bibliothèque statique ne peut pas être appelé

Android NDK import-module/code reuse

Mais pour quelque raison quand je mets en œuvre la solution qu'ils énumérés, il n'a pas travaille pour moi. La seule différence que j'ai dans mon projet est que j'utilise 1 makefile pour l'ensemble du projet. Ainsi, les modules se présentent comme suit: (... = plusieurs fichiers ou chemins)

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_MODULE := mod1 
LOCAL_C_INCLUDES := $(LOCAL_PATH)/to/c/includes \ 
... \ 
LOCAL_SRC_FILES := stringTester.cpp \ 
... \ 
include$(BUILD_STATIC_LIBRARY) 


include $(CLEAR_VARS) 

LOCAL_MODULE := mod2 
LOCAL_C_INCLUDES := $(LOCAL_PATH)/to/c/includes \ 
... \ 
LOCAL_SRC_FILES := localSourceFile.cpp \ 
... \ 
include$(BUILD_STATIC_LIBRARY) 

et ainsi de suite pour 2 modules, puis dans le dernier module:

include $(CLEAR_VARS) 

LOCAL_MODULE := sharedMod 
LOCAL_C_INCLUDES := $(LOCAL_PATH)/to/c/includes \ 
... \ 
LOCAL_STATIC_LIBRARIES := mod1 mod2 mod3 mod4 
... \ 
include $(BUILD_SHARED_LIBRARY) 

et dans mon java fichier:

package com.string.test 

public class javaTest{ 

public native String returnAString(); 

static{ 
    System.LoadLibrary("sharedMod"); 
    } 
} 

le problème que je suis en cours d'exécution en est que je ne peux pas appeler toutes les méthodes des bibliothèques statiques, comme toute méthode stringTester.cpp, mais si je propose que le fichier à inclure dans le module crée la bibliothèque partagée, veille Tout fonctionne comme il se doit, les wrappers Java sont corrects et les méthodes renvoient les données attendues. La seule raison pour laquelle je ne déplace pas tous les fichiers dans une bibliothèque partagée est qu'ils sont des projets distincts et évolutifs, tels que notre moteur physique et ainsi de suite. J'ai également essayé de séparer les modules avec chaque module ayant son propre fichier makefile, et ayant aussi un fichier cpp dans la bibliothèque partagée qui appelait les méthodes dans les bibliothèques statiques mais j'obtiendrais beaucoup d'échecs de référence non résolus. Une autre solution que j'ai essayée était d'utiliser LOCAL_WHOLE_STATIC_LIBRARIES pour charger les bibliothèques statiques mais cela m'a donné aussi des erreurs de référence non résolues.

Toute aide ou suggestion est appréciée. Je suis à bout de nerfs et à un barrage routier.

+0

Essayez-vous de charger une bibliothèque statique et utilisez-la à partir de votre code Java? Vous ne pouvez pas faire cela - cela doit être une lib partagée. (Bien que vous puissiez compiler différentes parties en tant que bibliothèque statique que vous utilisez pour produire une bibliothèque partagée finale, bien que des précautions doivent être prises avec les drapeaux d'ordre de liaison et d'éditeur de liens, LOCAL_WHOLE_STATIC_LIBRARIES est probablement la meilleure approche, mais je ne connais pas Système Android.mk assez pour donner des conseils spécifiques) – nos

+0

Je charge la bibliothèque partagée en Java, mais j'avais l'impression que je pourrais utiliser des fonctions d'une bibliothèque statique si elles étaient incluses dans la bibliothèque partagée (comme si j'essayais faire dans le dernier module). Si je ne peux pas faire cela alors je vais essayer de compiler toutes les sources dans une bibliothèque partagée parce que j'aurai besoin d'accéder aux méthodes des autres modules. – SuperDave

+0

Si vos liens de bibliothèque partagée dans vos bibliothèques statiques, oui, vous pouvez le faire. Cependant, quelque chose dans la bibliothèque partagée doit référencer les fonctions dans votre bibliothèque statique, sinon elles seront simplement supprimées. Si vous souhaitez inclure tout le code des bibliothèques statiques, vous devez utiliser LOCAL_WHOLE_STATIC_LIBRARIES, donc cela peut être utile si vous essayez cela et que vous publiez output/code/etc en rapport avec les erreurs que vous obtenez. (avec d'autres informations pertinentes, par exemple la version NDK) – nos

Répondre

1

La réponse est certainement à utiliser:

LOCAL_WHOLE_STATIC_LIBRARIES := mod1 mod2 mod3 mod4 

je courais dans d'autres problèmes avec toutes les autres bibliothèques, mais lorsqu'elle est réduite à un test simple, en utilisant la macro ci-dessus a fonctionné. Merci à nos pour l'aide !!

Questions connexes