当前位置: 代码迷 >> Android >> JNI函数调用失败,该如何处理
  详细解决方案

JNI函数调用失败,该如何处理

热度:19   发布时间:2016-05-01 13:05:59.0
JNI函数调用失败
工作中遇到一个问题:JAVA 调用 JNI 函数失败。检查了 JNI 函数的函数名,没有问题。在网上搜了一下,说的是因为没有导出 JNI 函数,于是在网上找了个例子试了一下,仍然失败,请求大家指点,谢谢!

JAVA 工程代码:
Java code
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 函数实现代码:
C/C++ code
#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:
C/C++ code
 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:
C/C++ code
APP_ABI := armeabiAPP_PLATFORM := android-8


logcat 错误信息:
XML code
10-25 10:08:17.452: E/test(3772): err10-25 10:08:17.472: W/WindowManager(188): updateFocusedWindowLocked newFocus=null mode=3 mCurrentFocus = null10-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: main10-25 10:08:17.492: E/AndroidRuntime(3772): java.lang.UnsatisfiedLinkError: stringFromJNI10-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)
  相关解决方案