Android JNI ndk-build错误:' jni'尚未宣布

时间:2016-05-05 06:22:19

标签: android c++ android-ndk java-native-interface

我想在本机方法中使用动态注册,因此我需要设置JNI_onLoad函数。我只是写一个函数来得到两个数的总和。但是,它无法正确构建。我该如何纠正错误?

  • 这是我的* .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命令时,它是错误的。但我真的不知道原因......

    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>

2 个答案:

答案 0 :(得分:2)

在Android NDK中,&lt; jni.h&gt; 未定义 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");

......等等。

答案 1 :(得分:0)

将标题位置添加到您的android.mk

LOCAL_C_INCLUDES := "path to your header location"