2015-02-06 64 views
3

我有libmath.so文件,它有原生方法。我需要在我的android代碼中調用本地方法。我創建了一個示例Android應用程序,並在libs/armeabi文件夾中添加了libmath.so,然後運行「右鍵單擊鼠標」 - > Android工具 - >添加本機支持。現在,在應用程序的jni文件夾內創建具有以下內容的下列文件。如何在Android代碼中使用.so文件來使用本地方法

Android.mk

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_MODULE := libmath 
LOCAL_SRC_FILES := libmath.cpp 
include $(BUILD_SHARED_LIBRARY) 

libmath.cpp

#include <jni.h> 

當我運行該項目作爲Android應用它顯示在控制檯如下: -

17:58:41 **** Build of configuration Default for project math **** 
"F:\\Vinay\\Softwares\\android-ndk-r10d\\ndk-build.cmd" all 
[armeabi] Compile++ thumb: math <= libmath.cpp 
[armeabi] StaticLibrary : libstdc++.a 
[armeabi] SharedLibrary : libmath.so 
[armeabi] Install  : libmath.so => libs/armeabi/libmath.so 
17:58:53 Build Finished (took 11s.695ms) 

這裏是代碼我怎麼了加載庫: -

public class MathJni { 
static { 
    System.loadLibrary("math"); 
} 
public native String calc(String paramString); 

}

public static final MathJni math = new MathJni(); 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     String s= math.calc("help"); 

    } 

運行Android應用程序時我通過模擬器啓動應用程序我得到下面的錯誤後一次。

02-06 07:38:36.900: D/dalvikvm(831): Trying to load lib /data/app-lib/com.example.math-2/libmath.so 0xb3cd0848 
02-06 07:38:36.900: D/dalvikvm(831): Added shared lib /data/app-lib/com.example.math-2/libmath.so 0xb3cd0848 
02-06 07:38:36.910: D/dalvikvm(831): No JNI_OnLoad found in /data/app-lib/com.example.math-2/libmath.so 0xb3cd0848, skipping init 
02-06 07:38:37.540: W/dalvikvm(831): No implementation found for native Lcom/example/math/MathJni;.calc:(Ljava/lang/String;)Ljava/lang/String; 
02-06 07:38:37.540: D/AndroidRuntime(831): Shutting down VM 
02-06 07:38:37.550: W/dalvikvm(831): threadid=1: thread exiting with uncaught exception (group=0xb3a20ba8) 
02-06 07:38:37.570: E/AndroidRuntime(831): FATAL EXCEPTION: main 
02-06 07:38:37.570: E/AndroidRuntime(831): Process: com.example.math, PID: 831 
02-06 07:38:37.570: E/AndroidRuntime(831): java.lang.UnsatisfiedLinkError: Native method not found: com.example.math.MathJni.calc:(Ljava/lang/String;)Ljava/lang/String; 
02-06 07:38:37.570: E/AndroidRuntime(831): at com.example.math.MathJni.calc(Native Method) 
02-06 07:38:37.570: E/AndroidRuntime(831): at com.example.math.MainActivity.onCreate(MainActivity.java:16) 

什麼可能是此錯誤的可能原因。

+1

android代碼?從什麼時候是本地代碼而不是android代碼? – Deduplicator 2015-02-06 12:54:48

+1

你沒有向我們展示你的C++代碼。 – Michael 2015-02-06 12:57:39

+0

邁克爾是非常正確的。儘管缺乏信息,但我仍然猜測你在MathJni類中沒有一個calc方法,它將一個java.lang.String實例作爲參數加入... – 2015-02-06 13:00:29

回答

1

如果您沒有編寫C++代碼並且只有預編譯的.so文件可以直接從Java使用,則不必使用NDK。

只需將.so文件放入您的項目中,在libs/<abi>下爲eclipse項目 - 在jniLibs/<abi>下爲gradle項目。

這裏你所做的是創建一個幾乎爲空的內容的libmath NDK模塊。當你建立你的項目時,NDK生成一個新的libmath.so文件,其中沒有任何東西來自你的初始庫。因此,請刪除所有jni文件和文件夾,將您以前的.so文件複製回libs/<abi>,然後再次運行您的項目。

如果遇到其他問題,請驗證您的libmath.so是否實現了jstring com_example_math_MathJni_calc(JNIEnv* env, jobject* obj),或者檢查您應該在Java端聲明本機的內容以使用lib,並使用正確的軟件包名稱和簽名(如果有文檔與您的.so文件一起出現,它應該說明這一點)。

+0

謝謝,我會試試這個。 – Vinay 2015-02-06 15:12:15

+0

當我嘗試如上所述,它正在登錄應用程序時在logcat中給出以下錯誤。 02-06 10:34:02.840:E/AndroidRuntime(1259):java.lang.UnsatisfiedLinkError: 無法從加載器加載數學運算符dalvik.system.PathClassLoader [DexPathList [[zip file「/data/app/com.math -1.apk「],nativeLibraryDirectories = [/數據/ APP-LIB/COM。math-1,/ system/lib]]]:findLibrary返回null – Vinay 2015-02-06 15:36:28

+0

你還在使用System.loadLibrary()嗎?你的錯誤讓我相信你切換到System.load()。你應該從logcat獲得比'findLibrary返回null'更多的調試信息。此外,請檢查您的.so文件是否已正確集成到您的apk中,方法是將其作爲zip文件打開,並驗證是否存在'lib/'內部。 – ph0b 2015-02-06 15:40:20

相關問題