工作中遇到一个问题:JAVA 调用 JNI 函数失败。检查了 JNI 函数的函数名,没有问题。在网上搜了一下,说的是因为没有导出 JNI 函数,于是在网上找了个例子试了一下,仍然失败,请求大家指点,谢谢!JAVA 工程代码:
package com.example.hellojni;import android.os.Bundle;
import android.widget.TextView;
import android.app.Activity;
import android.util.Log;public class HelloJni extends Activity { @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); TextView tv = new TextView(this);
tv.setText(stringFromJNI());
setContentView(tv);
} public native String stringFromJNI(); static {
try
{
System.loadLibrary("hello-jni");
}
catch (Exception e)
{
Log.e("test", "error");
}
catch (Throwable e)
{
Log.e("test", "err");
}
}
}
JNI 函数实现代码:
#include <jni.h>
#include <string.h>
#include <android/log.h>
using namespace std;
jstring Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv* env, jobject thiz)
{
return (env)->NewStringUTF("Hello from JNI !");
}static JNINativeMethod const gMethods[] =
{
{ "stringFromJNI", "()Ljava/lang/String;", (void*) Java_com_example_hellojni_HelloJni_stringFromJNI }
};
jint JNI_OnLoad(JavaVM *jvm, void *reserved)
{
JNIEnv* env = NULL;
if (jvm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK)
{
return -1;
} jclass clazz = (env)->FindClass("com/example/hellojni/HelloJni");
if (clazz)
{
(env)->RegisterNatives(clazz, gMethods, sizeof(gMethods) / sizeof(gMethods[0]));
} return JNI_VERSION_1_4;
}void JNI_OnUnload(JavaVM *jvm, void *reserved)
{
return;
}Android.mk:
LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= hello.cpp
LOCAL_LDLIBS += -llog -ldl
LOCAL_MODULE:=libhello-jni
LOCAL_PRELINK_MODULE := false
include $(BUILD_SHARED_LIBRARY)Application.mk:
APP_ABI := armeabi
APP_PLATFORM := android-8logcat 错误信息:10-25 10:08:17.452: E/test(3772): err
10-25 10:08:17.472: W/WindowManager(188): updateFocusedWindowLocked newFocus=null mode=3 mCurrentFocus = null
10-25 10:08:17.482: W/dalvikvm(3772): No implementation found for native Lcom/example/hellojni/HelloJni;.stringFromJNI ()Ljava/lang/String;
10-25 10:08:17.482: W/dalvikvm(3772): threadid=1: thread exiting with uncaught exception (group=0x2aacc8a0)
10-25 10:08:17.492: E/AndroidRuntime(3772): FATAL EXCEPTION: main
10-25 10:08:17.492: E/AndroidRuntime(3772): java.lang.UnsatisfiedLinkError: stringFromJNI
10-25 10:08:17.492: E/AndroidRuntime(3772): at com.example.hellojni.HelloJni.stringFromJNI(Native Method)
10-25 10:08:17.492: E/AndroidRuntime(3772): at com.example.hellojni.HelloJni.onCreate(HelloJni.java:19)
10-25 10:08:17.492: E/AndroidRuntime(3772): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
10-25 10:08:17.492: E/AndroidRuntime(3772): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2669)
10-25 10:08:17.492: E/AndroidRuntime(3772): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2721)
10-25 10:08:17.492: E/AndroidRuntime(3772): at android.app.ActivityThread.access$2300(ActivityThread.java:132)
10-25 10:08:17.492: E/AndroidRuntime(3772): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2071)
10-25 10:08:17.492: E/AndroidRuntime(3772): at android.os.Handler.dispatchMessage(Handler.java:99)
10-25 10:08:17.492: E/AndroidRuntime(3772): at android.os.Looper.loop(Looper.java:123)
10-25 10:08:17.492: E/AndroidRuntime(3772): at android.app.ActivityThread.main(ActivityThread.java:4669)
10-25 10:08:17.492: E/AndroidRuntime(3772): at java.lang.reflect.Method.invokeNative(Native Method)
10-25 10:08:17.492: E/AndroidRuntime(3772): at java.lang.reflect.Method.invoke(Method.java:521)
10-25 10:08:17.492: E/AndroidRuntime(3772): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:876)
10-25 10:08:17.492: E/AndroidRuntime(3772): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:634)
10-25 10:08:17.492: E/AndroidRuntime(3772): at dalvik.system.NativeStart.main(Native Method)
package com.example.hellojni;import android.os.Bundle;
import android.widget.TextView;
import android.app.Activity;
import android.util.Log;public class HelloJni extends Activity { @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); TextView tv = new TextView(this);
tv.setText(stringFromJNI());
setContentView(tv);
} public native String stringFromJNI(); static {
try
{
System.loadLibrary("hello-jni");
}
catch (Exception e)
{
Log.e("test", "error");
}
catch (Throwable e)
{
Log.e("test", "err");
}
}
}
JNI 函数实现代码:
#include <jni.h>
#include <string.h>
#include <android/log.h>
using namespace std;
jstring Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv* env, jobject thiz)
{
return (env)->NewStringUTF("Hello from JNI !");
}static JNINativeMethod const gMethods[] =
{
{ "stringFromJNI", "()Ljava/lang/String;", (void*) Java_com_example_hellojni_HelloJni_stringFromJNI }
};
jint JNI_OnLoad(JavaVM *jvm, void *reserved)
{
JNIEnv* env = NULL;
if (jvm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK)
{
return -1;
} jclass clazz = (env)->FindClass("com/example/hellojni/HelloJni");
if (clazz)
{
(env)->RegisterNatives(clazz, gMethods, sizeof(gMethods) / sizeof(gMethods[0]));
} return JNI_VERSION_1_4;
}void JNI_OnUnload(JavaVM *jvm, void *reserved)
{
return;
}Android.mk:
LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= hello.cpp
LOCAL_LDLIBS += -llog -ldl
LOCAL_MODULE:=libhello-jni
LOCAL_PRELINK_MODULE := false
include $(BUILD_SHARED_LIBRARY)Application.mk:
APP_ABI := armeabi
APP_PLATFORM := android-8logcat 错误信息:10-25 10:08:17.452: E/test(3772): err
10-25 10:08:17.472: W/WindowManager(188): updateFocusedWindowLocked newFocus=null mode=3 mCurrentFocus = null
10-25 10:08:17.482: W/dalvikvm(3772): No implementation found for native Lcom/example/hellojni/HelloJni;.stringFromJNI ()Ljava/lang/String;
10-25 10:08:17.482: W/dalvikvm(3772): threadid=1: thread exiting with uncaught exception (group=0x2aacc8a0)
10-25 10:08:17.492: E/AndroidRuntime(3772): FATAL EXCEPTION: main
10-25 10:08:17.492: E/AndroidRuntime(3772): java.lang.UnsatisfiedLinkError: stringFromJNI
10-25 10:08:17.492: E/AndroidRuntime(3772): at com.example.hellojni.HelloJni.stringFromJNI(Native Method)
10-25 10:08:17.492: E/AndroidRuntime(3772): at com.example.hellojni.HelloJni.onCreate(HelloJni.java:19)
10-25 10:08:17.492: E/AndroidRuntime(3772): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
10-25 10:08:17.492: E/AndroidRuntime(3772): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2669)
10-25 10:08:17.492: E/AndroidRuntime(3772): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2721)
10-25 10:08:17.492: E/AndroidRuntime(3772): at android.app.ActivityThread.access$2300(ActivityThread.java:132)
10-25 10:08:17.492: E/AndroidRuntime(3772): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2071)
10-25 10:08:17.492: E/AndroidRuntime(3772): at android.os.Handler.dispatchMessage(Handler.java:99)
10-25 10:08:17.492: E/AndroidRuntime(3772): at android.os.Looper.loop(Looper.java:123)
10-25 10:08:17.492: E/AndroidRuntime(3772): at android.app.ActivityThread.main(ActivityThread.java:4669)
10-25 10:08:17.492: E/AndroidRuntime(3772): at java.lang.reflect.Method.invokeNative(Native Method)
10-25 10:08:17.492: E/AndroidRuntime(3772): at java.lang.reflect.Method.invoke(Method.java:521)
10-25 10:08:17.492: E/AndroidRuntime(3772): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:876)
10-25 10:08:17.492: E/AndroidRuntime(3772): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:634)
10-25 10:08:17.492: E/AndroidRuntime(3772): at dalvik.system.NativeStart.main(Native Method)
解决方案 »
- Canvas类怎么在Activity里面的ImageView里画数字
- VideoView实现截图求救
- setresult 后之前的acitvity执行ondestory 怎么破?
- 关于如何屏蔽android的短信提示消息
- android支持多点触屏吗?
- android全屏与Imageview的单击事件
- 使用startResultForActivity无法刷新列表
- 请问《光辉之城》里面这样的地图是如何实现的?
- html5怎么开发android啊,用什么工具
- 最近安装Android studio运行有问题
- 请问Tabhost建立切换卡,想实现在点击某一个Tab时不让它切换如何实现?
- 每个Android手机都有返回键吗
声明加extern "C"