gpt4 book ai didi

java - Android NDK : No JNI_OnLoad found in . .. 跳过初始化:但是有 JNI_OnLoad

转载 作者:行者123 更新时间:2023-11-30 09:06:57 25 4
gpt4 key购买 nike

我不得不再次问这个问题。

我在运行基于 NDK 的应用程序时遇到此错误。

D dalvikvm: No JNI_OnLoad found in /data/app-lib/com.venky-1/libme.so 0xa5082228, skipping init W dalvikvm: No implementation found for native Lcom/venky/Home;.getPermission:(Landroid/app/Activity;)I

我经历过

  1. No JNI_OnLoad found in ... skipping init
  2. No JNI_OnLoad found skipping init > Application shutdown
  3. No JNI_Onload() found and VM shutting down
  4. JNI_OnLoad not found

他们的问题要么是

  1. 他们没有使用 JNI_OnLoad,因为他们使用了 JNI 特定的命名约定(例如 Java_com_venky_Home_start())。因此,此消息没有任何意义,因为还有其他选择。
  2. 他们使用的是 C++,并且存在函数名称混淆问题。

我的情况完全不同。以上两个在我的情况下是无效的。我正在使用 C 文件。所以没有修改。而且我没有使用 JNI 类的函数名称。我正在使用 JNI_OnLoad 手动注册函数。因此我的结论是“未找到实现”是因为应用程序无法找到 JNI_OnLoad。但为什么?它存在于 C 文件中。

相关部分代码如下。请询问您是否需要更多。

jni/Android.mk

include $(CLEAR_VARS)
LOCAL_MODULE := me
LOCAL_SRC_FILE := me.c
include $(BUILD_SHARED_LIBRARY)

com/venky/Home.java

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

#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");

}

最佳答案

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

jni/Android.mk

  include $(CLEAR_VARS)
LOCAL_MODULE := me
- LOCAL_SRC_FILE := me.c
+ LOCAL_SRC_FILES := me.c
include $(BUILD_SHARED_LIBRARY)

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

关于java - Android NDK : No JNI_OnLoad found in . .. 跳过初始化:但是有 JNI_OnLoad,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24233825/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com