首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android :没有在.跳过init :但是有JNI_OnLoad

Android :没有在.跳过init :但是有JNI_OnLoad
EN

Stack Overflow用户
提问于 2014-06-15 20:28:03
回答 1查看 11.4K关注 0票数 2

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

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

dalvikvm:没有在/data/app-lib/com.venky-1/libme.so 0xa5082228中找到JNI_OnLoad,跳过init W dalvikvm:没有为本机Lcom/venky/Home;.getPermission:(Landroid/app/Activity;)I找到实现

我经历过

  1. OnLoad found in ... skipping init
  2. OnLoad found skipping init > Application shutdown
  3. Onload() found and VM shutting down
  4. OnLoad not found

他们的问题不是

  1. 他们没有使用JNI_OnLoad,因为他们使用了JNI特定的命名约定(例如,Java_com_venky_Home_start())。因此,这条信息没有任何意义,因为有一种选择。
  2. 他们使用的是C++,还有函数名mangling。

我的情况完全不同。以上两项在我的情况下是无效的。我正在使用C文件。所以不要乱糟糟。我也不使用JNI的函数名。我正在使用JNI_OnLoad手动注册函数。因此,我的结论是,“找不到实现”是因为应用程序不知怎么找不到JNI_OnLoad。但是为什么呢?它存在于C文件中。

代码的相关部分如下。如果你需要更多的话,请问一下。

jni/Android.mk

代码语言:javascript
复制
include $(CLEAR_VARS)
LOCAL_MODULE := me
LOCAL_SRC_FILE := me.c
include $(BUILD_SHARED_LIBRARY)

com/venky/Home.java

代码语言:javascript
复制
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);
    }
}

jni/me.c

代码语言:javascript
复制
#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");

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-16 04:50:35

在“AlexCohn”的帮助下,我发现了我的错误。这是一个多么愚蠢的错误。

jni/Android.mk

代码语言:javascript
复制
  include $(CLEAR_VARS)
  LOCAL_MODULE := me
- LOCAL_SRC_FILE := me.c
+ LOCAL_SRC_FILES := me.c
  include $(BUILD_SHARED_LIBRARY)

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24233825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档