Android NDK找不到本机功能

时间:2014-12-24 20:31:30

标签: android android-ndk

Java代码:

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 个答案:

答案 0 :(得分:1)

您应该在共享对象中声明您的本机方法,如此

JNIEXPORT jstring Java_com_example_maxim_myapplication_MainActivity_stringFromJNI (JNIEnv *env, jobject obj)

关键点是JNIEXPORT,它指示链接器/编译器公开/导出您的本机方法

编辑 - 您还需要确保确实&#34;正确&#34;正在加载so(libhello-jni.so)(在某种意义上,这个so确实包含了你的方法实现,也许你的库路径中某处有一些陈旧的so

logcat加载<{1}}时将调试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
}