Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android NDK应用程序抛出错误-未满足链接错误_Java_Android_C++_Android Ndk_Java Native Interface - Fatal编程技术网

Java Android NDK应用程序抛出错误-未满足链接错误

Java Android NDK应用程序抛出错误-未满足链接错误,java,android,c++,android-ndk,java-native-interface,Java,Android,C++,Android Ndk,Java Native Interface,我正在开发基于NDK的Android应用程序。现在我正在学习使用示例HelloWorld应用程序。但它每次都会抛出错误。请指出哪里错了 注意:我所有的cpp文件都只在jni文件夹中 在LogCat中,调试时,它说 08-19 14:52:59.340:W/dalvikvm469:未找到的实现 出生地的 Lcom/example/myfirstndkapp/MainActivity;。使用CPPString的concatenemystring Ljava/lang/String;Ljava/lan

我正在开发基于NDK的Android应用程序。现在我正在学习使用示例HelloWorld应用程序。但它每次都会抛出错误。请指出哪里错了

注意:我所有的cpp文件都只在jni文件夹中

在LogCat中,调试时,它说

08-19 14:52:59.340:W/dalvikvm469:未找到的实现 出生地的 Lcom/example/myfirstndkapp/MainActivity;。使用CPPString的concatenemystring Ljava/lang/String;Ljava/lang/String

以下是基本代码:

MainActivity.java

Android.mk

Application.mk

Core.h和Core.cpp

我发现CoreWrapper.h类应该使用javah命令自动生成。所以每次我们都需要更新一个java类文件并重新生成这个jni文件

根据jni生成的头文件,我们需要创建它的cpp文件,以便编写代码逻辑

我发现这个教程非常有用。它帮助我发现了我的错误

此外,它还包含清晰的逐步信息


希望这能帮助其他正在寻找的人。

函数头是由javah生成的还是只是手动键入的?在jeneral中,您应该从hello jni示例开始,它在NDK中,可以工作。在你让它工作之后,你可以试着改变它。
package com.example.myfirstndkapp;

import android.support.v7.app.ActionBarActivity;

import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.view.*;

public class MainActivity extends ActionBarActivity {

    static {
        System.loadLibrary("MyFirstNDKApp");
        }

    private native String concateneMyStringWithCppString(String myString);

    private EditText tvGetValue = null;
    private TextView tvSetValue = null;
    private Button btnCallCPPMethod = null;

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

        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment()).commit();
        }

        String str = concateneMyStringWithCppString("OutputString");



        System.out.println("output : "+str);

        }
}
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := MyFirstNDKApp
LOCAL_SRC_FILES := CoreWrapper.cpp
LOCAL_SRC_FILES += Core.cpp
LOCAL_C_INCLUDES := $(LOCAL_PATH)
include $(BUILD_SHARED_LIBRARY)
APP_STL := gnustl_static
APP_ABI := all
//
//  Core.h
#ifndef __MyFistNDKApp__Core__
#define __MyFistNDKApp__Core__

#include <iostream>
const char* concateneMyStringWithCppString(const char* myString);
#endif /* defined(__MyFistNDKApp__Core__) */

//  Core.cpp

#include "Core.h"

const char* CPP_BASE_STRING = "cpp says hello world to %s";

const char* concateneMyStringWithCppString(const char* myString) {
    char* concatenedString = new char[strlen(CPP_BASE_STRING) + strlen(myString)];
    sprintf(concatenedString, CPP_BASE_STRING, myString);
    return concatenedString;
}
//  CoreWrapper.c

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

extern "C" {

JNIEXPORT jstring JNICALL com_example_myfirstndkapp_MainActivity_concateneMyStringWithCppString(JNIEnv* env, jobject thiz, jstring myString) {
    return env->NewStringUTF(concateneMyStringWithCppString(env->GetStringUTFChars(myString, 0)));
}

}
public UnsatisfiedLinkError(String detailMessage) {
    super(detailMessage);
}