2015-02-06 68 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

相关问题