Java Android NDK:在中找不到JNI_OnLoad。。。跳过初始化:但是有JNI_OnLoad

Java Android NDK:在中找不到JNI_OnLoad。。。跳过初始化:但是有JNI_OnLoad,java,android,android-ndk,java-native-interface,Java,Android,Android Ndk,Java Native Interface,我再次问这个问题,因为我必须这样做 运行基于NDK的应用程序时出现此错误 D dalvikvm:在/data/app lib/com.venky-1/libme.so 0xa5082228中未找到JNI_OnLoad,正在跳过初始化 W dalvikvm:未找到本机Lcom/venky/Home;的实现;。getPermission:(Landroid/app/Activity;)I 我经历过 他们的问题是 他们没有使用JNI_OnLoad,因为他们使用了特定于JNI的命名约定(例如Ja

我再次问这个问题,因为我必须这样做

运行基于NDK的应用程序时出现此错误

D dalvikvm:在/data/app lib/com.venky-1/libme.so 0xa5082228中未找到JNI_OnLoad,正在跳过初始化 W dalvikvm:未找到本机Lcom/venky/Home;的实现;。getPermission:(Landroid/app/Activity;)I

我经历过

  • 他们的问题是

  • 他们没有使用JNI_OnLoad,因为他们使用了特定于JNI的命名约定(例如Java_com_venky_Home_start())。因此,这一信息没有意义,因为还有其他选择
  • 它们使用C++,函数名为“.L/LI>”。 我的情况完全不同。以上两项在我的情况下无效。我正在使用C文件。所以不要弄坏了。我没有使用JNI类型的函数名。我正在使用JNI_OnLoad手动注册函数。 因此,我的结论是“找不到实现”是因为应用程序不知何故无法找到JNI_OnLoad。但是为什么呢?它存在于C文件中

    守则的有关章节如下。如果您需要更多,请询问

    jni/Android.mk

    com/venky/Home.java

    jni/me.c

    #包括
    #包括
    #包括
    #包括
    #包括
    #包括
    #定义日志标签“com.venky.me”
    #定义日志(…)\uuuuuuAndroid\uLog\uPrint(android\uLog\uDebug,LOG\uTag,VA\uArgs)
    #定义日志F(fn\u名称)\uuu android\u LOG\u write(android\u LOG\u DEBUG,LOG\u标记),称为:“fn\u名称”
    静态JavaVM*java_vm;
    jint JNI_OnLoad(JavaVM*vm,void*reserved)
    {
    LOG_F(“JNI_OnLoad”);
    java_vm=vm;
    //获取所有函数调用的JNI Env
    JNIEnv*env;
    if((*vm)->GetEnv(vm,(void**)和env,JNI_版本1_6)!=JNI_OK){
    LOG_D(“GetEnv失败”);
    返回-1;
    }
    //查找调用本机函数的类
    jclass NativeUsb=(*env)->FindClass(env,“com/venky/Home”);
    如果(类_home==NULL){
    LOG_D(“FindClass失败:未找到任何类”);
    返回-1;
    }
    //为getUsbPermission注册本机方法
    JNINativeMethod nm[1]={
    {“getPermission”,“(Landroid/app/Activity;)I”,get_permission}
    };
    if((*env)->注册地址(env、NativeUsb、nm、1)){
    LOG_D(“注册失败”);
    返回-1;
    }
    返回JNI_版本_1_6;
    }
    int get_权限(作业对象活动)
    {
    日志(“获取usb权限”);
    }
    
    在@AlexCohn的帮助下,我发现了我的错误。这是多么愚蠢的错误

    jni/Android.mk


    因此,me.c没有编译。因此,它未包含在构建的共享库中。我至少在这上面浪费了几个小时。

    nm-D libmy是怎么说的呢?请参阅
    00002010a\uuu bss\U start U\uuu cxa\U atexit U\uuuu cxa\U finalize 00002010a\U edata 00002010a\U end U\uu stack\U chk\U fail
    @AlexCohn可以看出,库存在问题。不过,对于上面未格式化的文本,我很抱歉。我试过了,但不能用代码格式。知道为什么共享对象的格式不正确吗?此处的注释忽略换行符,但您可以链接到pastebin.com,或更新问题。我想查看clean
    ndk build V=1
    @AlexCohn的输出,我得到了错误的原因。请看下面的答案。这很愚蠢。
    include $(CLEAR_VARS)
    LOCAL_MODULE := me
    LOCAL_SRC_FILE := me.c
    include $(BUILD_SHARED_LIBRARY)
    
    package com.venky;
    
    import android.app.Activity;
    import android.os.Bundle;
    
    public class Home extends Activity {
    
        static {
            System.loadLibrary("me");
        }
    
    
        private native int getPermission(Activity activity);
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.home);
            getPermission(this);
        }
    }
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdarg.h>
    #include <string.h>
    #include <android/log.h>
    #include <jni.h>
    
    #define LOG_TAG "com.venky.me"
    
    #define LOG_D(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
    #define LOG_F(fn_name) __android_log_write(ANDROID_LOG_DEBUG, LOG_TAG, "Called : " fn_name )
    
    static JavaVM *java_vm;
    
    jint JNI_OnLoad(JavaVM *vm, void *reserved)
    {
        LOG_F ("JNI_OnLoad");
        java_vm = vm;
    
        // Get JNI Env for all function calls
        JNIEnv* env;
        if ((*vm)->GetEnv(vm, (void **) &env, JNI_VERSION_1_6) != JNI_OK) {
            LOG_D ("GetEnv failed.");
            return -1;
        }
    
        // Find the class calling native function
        jclass NativeUsb = (*env)->FindClass(env, "com/venky/Home");
        if (class_home == NULL) {
            LOG_D ("FindClass failed : No class found.");
            return -1;
        }
    
        // Register native method for getUsbPermission
        JNINativeMethod nm[1] = {
            { "getPermission", "(Landroid/app/Activity;)I", get_permission}
        };
    
        if ((*env)->RegisterNatives(env, NativeUsb, nm , 1)) {
             LOG_D ("RegisterNatives Failed.");
             return -1;
        }
    
        return JNI_VERSION_1_6;
    }
    
    int get_permission (jobject activity)
    {
        LOG_F ("get_usb_permission");
    
    }
    
      include $(CLEAR_VARS)
      LOCAL_MODULE := me
    - LOCAL_SRC_FILE := me.c
    + LOCAL_SRC_FILES := me.c
      include $(BUILD_SHARED_LIBRARY)