2013-08-07 48 views
0

我正在嘗試使用jni編寫一些android應用程序。Android makefile包含動態庫運行時錯誤

我有一個活動文件,它實例化另一個類,它調用jni函數。

我cpp的代碼被編譯罰款,位置放庫/ armeabi/libAppList.so

我的Java文件是這樣的。

package com.example.applist; 

public class Backend { 
    static { 

     try { 
      System.loadLibrary("AppList"); 
     } catch(Exception e) { 
      Log.d("Backend","caught exception" + e); 
     } 

    }   

    public native int createGroup() ; 
} 

和我的makefile就像下面

LOCAL_PATH:= $(call my-dir) 
include $(CLEAR_VARS) 

LOCAL_MODULE_TAGS := optional 

#Only compile source java files in this apk. 

LOCAL_SRC_FILES := $(call all-java-files-under, src) 

LOCAL_PACKAGE_NAME := AppList 

LOCAL_CERTIFICATE := platform 

include $(BUILD_PACKAGE) 
LOCAL_PREBUILT_LIBS := libs/armeabi/libAppList.so 
include $(BUILD_MULTI_PREBUILT) 

我只是從我的主要活動類實例化這個類進行測試。 (new backend();) 但是,我收到一個運行時錯誤。有人可以解釋我在做什麼不正確嗎?我只是一個新的學習者。

#編輯: 我想出瞭如何編寫正確的生成文件。 這就是:

LOCAL_PATH:= $(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_MODULE_TAGS := optional 
# Only compile source java files in this apk. 
LOCAL_SRC_FILES := $(call all-java-files-under, src) 
LOCAL_REQUIRED_MODULES := libAppListBack 
LOCAL_SHARED_LIBRARIES := libAppListBack 
LOCAL_PACKAGE_NAME := AppListNew 
LOCAL_CERTIFICATE := platform 
include $(BUILD_PACKAGE) 

include $(CLEAR_VARS) 
LOCAL_MODULE_TAGS := optional 
LOCAL_PREBUILT_LIBS := libAppListBack:libs/armeabi/libAppListBack.so 
include $(BUILD_MULTI_PREBUILT) 

#include $(call all-makefiles-under,$(LOCAL_PATH)) 

不過C代碼我要通過構建NDK並進行.so文件。 如果我取消註釋最後一行,然後執行其他makefile,但無法找到位於同一目錄中的.cpp文件。我得到一個錯誤沒有規則使'/Backend.cpp'。任何人都可以幫忙嗎?

它看起來像這樣:

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_MODULE := AppListBack 
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog 
LOCAL_SRC_FILES := Backend.cpp 
LOCAL_C_INCLUDES += $(JNI_H_INCLUDE) 
LOCAL_MODULE_TAGS := optional 
#LOCAL_PRELINK_MODULE := false 

include $(BUILD_SHARED_LIBRARY) 
+0

糟糕,它看起來像一個** [andorid源](http://stackoverflow.com/tags/android-source/info)**問題畢竟。我錯過了什麼嗎? –

+0

因此,您爲''appApp'和'$ {AppListNew}/jni/Android.mk'文件生成了'$ {AppListNew}/Android.mk'文件,'ibAppListBack.so'和'$ {AppListNew}/jni/Backend.cpp'文件。但第二個文件替代地查找'/ Backend.cpp'。這是情況嗎? –

+0

@AlexCohn嗨,其實我留下了使用jni來支持使用套接字的想法,因爲我的C應用程序需要一些特殊權限,我無法使用jni來解決這個問題。我做了一個套接字,並通過java代碼產生了C++,然後建立了一個套接字並傳遞了數據。 –

回答

0

不要在生成文件(Android.mk)編譯Java。您應該使用Ant構建應用程序的Java部分。更簡單 - 使用像Google的ADT軟件包這樣的GUI環境。它甚至可以爲你運行ndk-build步驟。

+0

我有一些必要通過生成文件。應該可以這樣做,因爲我在上面做,不是嗎? –

+0

構建Android應用程序的支持方式是[使用ant](http://developer.android.com/tools/building/building-cmdline.html)。是的,你可以從make調用'ant release'(使用APK文件作爲目標,並且很難列出這個目標所依賴的所有文件)。 –