2014-12-24 4 views
2

Java код:Android NDK не может найти родную функцию

package com.example.maxim.myapplication; 

//... 

public class MainActivity extends ActionBarActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     TextView tv = new TextView(this); 
     tv.setText(stringFromJNI()); 
     setContentView(tv); 
    } 

    public native String stringFromJNI(); 

    static { 
     System.loadLibrary("hello-jni"); 
     } 


} 

код C:

#include <string.h> 
#include <jni.h> 


    jstring Java_com_example_maxim_myapplication_MainActivity_stringFromJNI(JNIEnv* env, 
                 jobject thiz) 
    { 


     return (*env)->NewStringUTF(env, "Hello from JNI ! Compiled with ABI ."); 
    } 

выход LogCat:

Process: com.example.maxim.myapplication, PID: 2306 
    java.lang.UnsatisfiedLinkError: No implementation found for java.lang.String com.example.maxim.myapplication.MainActivity.stringFromJNI() (tried Java_com_example_maxim_myapplication_MainActivity_stringFromJNI and Java_com_example_maxim_myapplication_MainActivity_stringFromJNI__) 
      at com.example.maxim.myapplication.MainActivity.stringFromJNI(Native Method) 
.... 

Имя пакета совпадает с именем функции, но есть ошибка. Имя пакета совпадает с именем функции, но есть ошибка

ответ

1

Вы должны объявить вам нативный метод внутри вашего общего объекта, как этот

JNIEXPORT jstring Java_com_example_maxim_myapplication_MainActivity_stringFromJNI (JNIEnv *env, jobject obj) 

Ключевым моментом является JNIEXPORT который instrucs линкер/компилятор обнажая/экспорт родной метод

EDIT - Вы также хотите сделать что действительно «правильно» so (libhello-jni.so) загружается (в том смысле, что действительно этот so содержит реализацию вашего метода, возможно, у вас есть несколько устаревших so где-то в вашем пути к библиотеке)

Добавить отлаживать logcat к вашим so на своей загрузку

jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) 
{ 

    LOGI("In JNI_OnLoad()"); 
    return JNI_VERSION_1_6; // or the version corresponded to your NDK version 
} 
+0

ту же ошибка (15 символов) – Hemul

+0

@Hemul, если это так, то убедитесь, что на самом деле так объект, который содержит реализацию методы загружаются, см. мое редактирование ответа –

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