2016-05-05 4 views
0

Я хочу использовать динамическую регистрацию в нативном методе, поэтому мне нужно установить функцию JNI_onLoad. Я просто пишу функцию, чтобы получить сумму двух чисел. Но он не может правильно построить. Как исправить ошибку?Android JNI ndk-build error: 'jni' не объявлен

  • Это мой файл * .cpp, я называю этот файл jni.cpp

    #include <jni.h> 
    extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) { 
    
        jni::JNIEnv& env = jni::GetEnv(*vm, jni::jni_version_1_6); 
        jni::jclass& nativeClass = jni::FindClass(env, "com/test/NativeClass"); 
    
        #define MAKE_NATIVE_METHOD(name, sig) jni::MakeNativeMethod<decltype(name), name>(#name, sig) 
        jni::RegisterNatives(env, nativeClass, MAKE_NATIVE_METHOD(nativeAddTest, "(II)I")  ); 
    
        return JNI_VERSION_1_6; 
    } 
    
    jlong nativeAddTest(JNIEnv *env, jni::jobject* obj, jni::jint a, jni::jint b) { 
        return a+b; 
    } 
    
  • Android.mk

    LOCAL_PATH := $(call my-dir) 
    
    include $(CLEAR_VARS) 
    
    LOCAL_MODULE := test 
    LOCAL_SRC_FILES := jni.cpp 
    LOCAL_LDLIBS := -L/ndk-path/sources/cxx-stl/stlport/libs/armeabi 
    
    include $(BUILD_SHARED_LIBRARY) 
    
  • Когда я использую ndk-build команду, это неправильно. Но я действительно dont't konw причина ...

    D:\WorkSpaces\Test\app\src\main\jni>ndk-build 
        [x86] Compile++  : test <= jni.cpp 
    D:/WorkSpaces/Test/app/src/main/jni/jni.cpp: In function 'jint JNI_OnLoad(JavaVM*, void*)': 
    D:/WorkSpaces/Test/app/src/main/jni/jni.cpp:9:5: error: 'jni' has not been declared 
        jni::JNIEnv& env = jni::GetEnv(*vm, jni::jni_version_1_6); 
    ^
    D:/WorkSpaces/Test/app/src/main/jni/jni.cpp:9:18: error: 'env' was not declared in this scope 
        jni::JNIEnv& env = jni::GetEnv(*vm, jni::jni_version_1_6); 
    .... 
    

Это, похоже, не может найти jni.h, но у меня уже есть #include<jni.h>

ответ

0

Добавить местоположение заголовка к вашему android.mk

LOCAL_C_INCLUDES := "path to your header location" 
+0

Это файл 'jni.h' файла? Я добавляю эту строку, но у нее также есть ошибка сборки. LOCAL_C_INCLUDES: = D: \ Android \ android-ndk-r10e \ platform \ android-21 \ arch-arm \ usr \ include' – kevin4z

+0

Попробуйте это: http: // stackoverflow .com/questions/13466777/jni-h-no-such-file-or-directory – Striker

2

В Android NDK, <jni.h> не определяет jni пространство имен. Просто удалите все JNI ::

#include <jni.h> 
extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) { 

    JNIEnv env; 
    vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6); 
    jclass nativeClass = env->FindClass("com/test/NativeClass"); 

... и так далее.

+0

Но если я удалю все 'jni ::', ошибка станет 'jni_version_1_6',' GetEnv' или другие, которые были зарегистрированы, не были объявлены в этом объем. – kevin4z

+0

Я загрузил этот проект на [github.com] (https://github.com/kevin4z/DynamicJNI), можете ли вы помочь мне изменить это? Я действительно не знаю, как использовать JNI. Спасибо :) – kevin4z

+0

см. Обновление. Я не знаю, где вы взяли свой шаблон, но это неверно. –