Android NDK 找不到原生函数

标签 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)
 ....

The package name is same as the name of the function, but there an errorThe package name is same as the function name, but the error

包名与函数名相同,但出现错误

最佳答案

你应该像这样在你的共享对象中声明你的本地方法

JNIEXPORT jstring Java_com_example_maxim_myapplication_MainActivity_stringFromJNI (JNIEnv *env, jobject obj)

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

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

so 加载时添加 debug logcat

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
}   

关于Android NDK 找不到原生函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27641912/

相关文章:

java - 如何在android中循环遍历TextView变量

安卓NDK开发

android - NDK 使用什么标志来发布 lib

Android Action_Call Intent

java - 在 Google App Engine 上按最新创建的顺序接收实体

android - 删除 DialogFragment 的标题

android - android中sqlite中的where子句

android - 如何将QCAR(Vuforia)的投影和模型 View 矩阵应用到min3D场景中

Android加速度计采样率随机尖峰

Android studio 2.1.1 无法识别 stdio.h 但运行良好