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

我有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  

当我将项目作为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  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) 

可能是导致此错误的原因。

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

只需将.so文件放在项目中,在libs/为eclipse项目 – 在jniLibs/为gradle项目。

这里你做的是创建一个几乎为空的内容的libmath NDK模块。 在构建项目时,NDK生成了一个新的libmath.so文件,其中没有任何来自您的初始库。 因此,删除所有jni文件和文件夹,将以前的.so文件复制回libs/ ,然后再次运行项目。

如果您遇到其他问题,请validation您的libmath.so是否实现了jstring com_example_math_MathJni_calc(JNIEnv* env, jobject* obj) ,或者检查您应该在Java端声明本机的内容以使用您的lib,并使用正确的包名和签名(如果有.so文件附带的文档,则应说明)。