【发布时间】:2015-02-06 12:53:34
【问题描述】:
我有 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)
这个错误的可能原因是什么。
【问题讨论】:
-
安卓代码?什么时候原生代码不是安卓代码了?
-
你还没有向我们展示你的 C++ 代码。
-
迈克尔是非常正确的。尽管缺乏信息,我仍然猜想你在 MathJni 类中没有一个 calc 方法,它接受一个 java.lang.String 实例作为参数......
-
我没有任何 c++ 代码。当我将 .so 添加到 android 项目并运行“Android 工具 -> 添加本机支持”时,生成了 .cpp 文件,这就是我在此处附加的内容。
-
对不起,我忘了添加 public native String calc(String paramString); MathJni 类中的行。现在我已经添加了它。
标签: java android eclipse android-ndk java-native-interface