如何在Android代码中使用.so文件来使用本机方法

时间:2015-02-06 12:53:35

标签: java android eclipse android-ndk java-native-interface

我有libmath.so文件,其中包含本机方法。我需要在我的android代码中调用本机方法。我创建了一个示例android应用程序,并在libs / armeabi文件夹中添加了libmath.so,然后运行"右键单击鼠标" - > Android工具 - >添加原生支持。现在,在应用程序的jni文件夹中创建以下具有以下内容的文件。

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 个答案:

答案 0 :(得分:2)

如果您没有编写任何C ++代码并且只能直接从Java使用预编译的.so文件,则不必使用NDK。

只需将.so文件放在项目中,在libs/<abi>下用于日食项目 - 在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文件一起提供的文档,应该说明。)