2015-05-11 2 views
0

У меня возникли проблемы при разработке android ndk. Я очень новичок в ndk и следую учебнику. Во время компиляции ошибка не возникает, но когда я загружаю приложение в устройство, это приводит к ошибке Native Method Not Found. Я прикрепил код и снял снимки своего пакета.Родной метод не найден: Package.methodName :() Ljava/lang/String;

AT НДК-билда я получил эту:

[arm64-v8a] Compile  : com_testing_ndk_FibLib <= com_testing_ndk_FibLib.c 
[arm64-v8a] SharedLibrary : libcom_testing_ndk_FibLib.so 
[arm64-v8a] Install  : libcom_testing_ndk_FibLib.so => libs/arm64-v8a/libcom_testing_ndk_FibLib.so 
[x86_64] Compile  : com_testing_ndk_FibLib <= com_testing_ndk_FibLib.c 
[x86_64] SharedLibrary : libcom_testing_ndk_FibLib.so 
[x86_64] Install  : libcom_testing_ndk_FibLib.so => libs/x86_64/libcom_testing_ndk_FibLib.so 
[mips64] Compile  : com_testing_ndk_FibLib <= com_testing_ndk_FibLib.c 
[mips64] SharedLibrary : libcom_testing_ndk_FibLib.so 
[mips64] Install  : libcom_testing_ndk_FibLib.so => libs/mips64/libcom_testing_ndk_FibLib.so 
[armeabi-v7a] Compile thumb : com_testing_ndk_FibLib <= com_testing_ndk_FibLib.c 
[armeabi-v7a] SharedLibrary : libcom_testing_ndk_FibLib.so 
[armeabi-v7a] Install  : libcom_testing_ndk_FibLib.so => libs/armeabi-v7a/libcom_testing_ndk_FibLib.so 
[armeabi] Compile thumb : com_testing_ndk_FibLib <= com_testing_ndk_FibLib.c 
[armeabi] SharedLibrary : libcom_testing_ndk_FibLib.so 
[armeabi] Install  : libcom_testing_ndk_FibLib.so => libs/armeabi/libcom_testing_ndk_FibLib.so 
[x86] Compile  : com_testing_ndk_FibLib <= com_testing_ndk_FibLib.c 
[x86] SharedLibrary : libcom_testing_ndk_FibLib.so 
[x86] Install  : libcom_testing_ndk_FibLib.so => libs/x86/libcom_testing_ndk_FibLib.so 
[mips] Compile  : com_testing_ndk_FibLib <= com_testing_ndk_FibLib.c 
[mips] SharedLibrary : libcom_testing_ndk_FibLib.so 
[mips] Install  : libcom_testing_ndk_FibLib.so => libs/mips/libcom_testing_ndk_FibLib.so 

FibLib.java

package com.testing.ndk; 

public class FibLib { 
     static { 
      System.loadLibrary("com_testing_ndk_FibLib"); // Load native library at runtime 
             // hello.dll (Windows) or libhello.so (Unixes) 
     } 

     // Declare a native method sayHello() that receives nothing and returns void 
     public static native String sayHello(); 

     // Test Driver 
     public static void main(String[] args) { 
      new FibLib().sayHello(); // invoke the native method 
     } 
    } 

com_testing_ndk_FibLib.c

#include <jni.h> 
#include <stdio.h> 
#include "com_testing_ndk_FibLib.h" 
// Implementation of native method sayHello() of HelloJNI class 

    JNIEXPORT void JNICALL Java_com_testing_ndk_FibLib_sayHello(JNIEnv *env, jobject thisObj) { 
    printf("Hello World!\n"); 
    return; 
} 

com_testing_ndk_FibLib.h

/* DO NOT EDIT THIS FILE - it is machine generated */ 
#include <jni.h> 
/* Header for class com_testing_ndk_FibLib */ 

#ifndef _Included_com_testing_ndk_FibLib 
#define _Included_com_testing_ndk_FibLib 
#ifdef __cplusplus 
extern "C" { 
#endif 
/* 
* Class:  com_testing_ndk_FibLib 
* Method: sayHello 
* Signature:()Ljava/lang/String; 
*/ 
JNIEXPORT jstring JNICALL Java_com_testing_ndk_FibLib_sayHello 
    (JNIEnv *, jclass); 

#ifdef __cplusplus 
} 
#endif 
#endif 

Application.mk

APP_PLATFORM := android-17 
APP_ABI :=all 

Android.mk Вход

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_SRC_FILES :=com_testing_ndk_FibLib.c 
LOCAL_MODULE :=com_testing_ndk_FibLib 
include $(BUILD_SHARED_LIBRARY) 

Ошибка:

[arm64-v8a] Compile  : com_testing_ndk_FibLib <= com_testing_ndk_FibLib.c 
jni/com_testing_ndk_FibLib.c:6:24: error: conflicting types for 'Java_com_testing_ndk_FibLib_sayHello' 
JNIEXPORT void JNICALL Java_com_testing_ndk_FibLib_sayHello(JNIEnv *env, jobject thisObj) { 
         ^
In file included from jni/com_testing_ndk_FibLib.c:3:0: 
jni/com_testing_ndk_FibLib.h:15:27: note: previous declaration of 'Java_com_testing_ndk_FibLib_sayHello' was here 
JNIEXPORT jstring JNICALL Java_com_testing_ndk_FibLib_sayHello 
         ^
make: *** [obj/local/arm64-v8a/objs/com_testing_ndk_FibLib/com_testing_ndk_FibLib.o] Error 1 

enter image description here

+2

Это очевидно - метод не найден потому что вы не реализовали метод с подписями 'JNIEXPORT jstring JNICALL Java_com_testing_ndk_FibLib_sayHello (JNIEnv *, jclass)', как это было предложено в файле заголовка. – nekavally

+0

@ Valentin благодарит за ваш ответ. Не могли бы вы исправить некоторые фрагменты кода здесь с вашим кодом, это поможет мне alot –

+0

Тот же вопрос, что и http://stackoverflow.com/questions/30152520/java-lang-unsatisfiedlinkerror-native-method-not-found-com-ziqitza -murgency-ac? – fadden

ответ

2

JNI peforms собственный поиск метода, используя его имя. Для того, чтобы гарантировать, что экспортируемая функцию она найдена правильно один, методы должны быть названа по следующей схеме:

Java_package_name_className_methodName 

Например, у вас случае имени родной функции должна быть Java_com_testing_ndk_FibLib_sayHello, но в вашем com_testing_ndk_FibLib.c нет функции с такими имя.

Следующий фрагмент должен быть прекрасным, если вы поместите его в этот файл.

com_testing_ndk_FibLib.c 

#include <jni.h> 
#include <stdio.h> 
#include "com_testing_ndk_FibLib.h" 

// Implementation of native method sayHello() of HelloJNI class 
JNIEXPORT void JNICALL Java_com_testing_ndk_FibLib_sayHello(JNIEnv *env, jobject thisObj) { 
    printf("Hello World!\n"); 
    return; 
} 


Чтобы исправить вашу проблему изменения типа возвращаемой подписи в com_testing_ndk_FibLib.h в строке 15

... 
JNIEXPORT void JNICALL Java_com_testing_ndk_FibLib_sayHello 
    (JNIEnv *, jclass); 
... 

и FibLib.java в строке 10:

... 
public static native String sayHello(); 
... 

Читайте о JNI здесь: http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html

+0

Спасибо за ваш ответ. Делая это, я получаю следующую ошибку: см. Мой обновленный журнал ошибок выше –

+0

ok, почему вы объявили «sayHello()» (в java), чтобы вернуть объект String, даже если он ничего не возвращает? Измените тип возвращаемого значения на void и снова создайте заголовочный файл. – nekavally

+0

не могли бы вы дать мне несколько фрагментов кода.Я запутался здесь –

Смежные вопросы