ошибки ndk-build, строковый формат, отсутствие такого файла или каталога - PullRequest
0 голосов
/ 10 февраля 2019

Я пытался создать простое тестовое приложение jni из книги "Beginning Android Games 3rd Ed".Я скопировал и вставил код, но когда я пытаюсь связать с помощью ndk-build, я получаю следующие сообщения об ошибках:

D:\apps\android\projects\NDK\app\src\main\java>ndk-build
[armeabi-v7a] Compile++ arm  : jniutils <= jniutils.cpp
jni/jniutils.cpp:8:52: error: format string is not a string literal (potentially insecure)
      [-Werror,-Wformat-security]
    __android_log_print(ANDROID_LOG_VERBOSE, cTag, cMessage);
                                                   ^~~~~~~~
jni/jniutils.cpp:8:52: note: treat the string as an argument to avoid this
    __android_log_print(ANDROID_LOG_VERBOSE, cTag, cMessage);
                                                   ^
                                                   "%s",
1 error generated.
make: *** [obj/local/armeabi-v7a/objs/jniutils/jniutils.o] Error 1

Если я пытаюсь трактовать эти ошибки как предупреждения и подавлять их следующими строкамив android.mk / application.mk:

APP_CFLAGS += -Wno-error=format-security
LOCAL_DISABLE_FORMAT_STRING_CHECKS := true

Тогда я получаю эту ошибку:

D:\apps\android\projects\NDK\app\src\main\java>ndk-build
[armeabi-v7a] SharedLibrary  : libjniutils.so
clang++.exe: error: no such file or directory: '遶上・llog'
make: *** [obj/local/armeabi-v7a/libjniutils.so] Error 1

Что я думаю, это просто мусор из памяти, как строка / переменная hasn 'ко мне обращались правильно.

Я очень плохо знаком с jni, поэтому я немного растерян, как решить эту проблему.


Код следует:

JniUtils.java

package com.badlogic.androidgames.ndk;
import java.nio.ByteBuffer;
public class JniUtils {
    static {
        System.loadLibrary("jniutils");
    }
    public static native void log(String tag, String message);
    public static native void copy(ByteBuffer dst, float[] src, int offset, int len);
}

jniutils.cpp

#include <android/log.h>
#include <string.h>
#include "jniutils.h"
JNIEXPORT void JNICALL Java_com_badlogic_androidgames_ndk_JniUtils_log
    (JNIEnv *env, jclass clazz, jstring tag, jstring message) {
    const char *cTag = env-> GetStringUTFChars(tag, 0);
    const char *cMessage = env-> GetStringUTFChars(message, 0);
    __android_log_print(ANDROID_LOG_VERBOSE, cTag, cMessage);
    env-> ReleaseStringUTFChars(tag, cTag);
    env-> ReleaseStringUTFChars(message, cMessage);
}


JNIEXPORT void JNICALL Java_com_badlogic_androidgames_ndk_JniUtils_copy
    (JNIEnv *env, jclass clazz, jobject dst, jfloatArray src, jint offset, jint len) {
    unsigned char* pDst = (unsigned char*)env-> GetDirectBufferAddress(dst);
    float* pSrc = (float*)env-> GetPrimitiveArrayCritical(src, 0); memcpy(pDst,
    pSrc + offset, len * 4);
    env-> ReleasePrimitiveArrayCritical(src, pSrc, 0);
}

application.mk

APP_ABI := armeabi-v7a x86
APP_PLATFORM := android-19

android.mk

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := jniutils
LOCAL_LDLIBS := − llog
LOCAL_ARM_MODE := arm
LOCAL_SRC_FILES := jniutils.cpp
include $(BUILD_SHARED_LIBRARY)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...