没有发现的Andr​​oid NDK本地方法错误 [英] Android NDK Native method not found error

查看:137
本文介绍了没有发现的Andr​​oid NDK本地方法错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用原生code构建Android应用程序,所以我想测试一下NDK运行successfully.When我尝试运行我的第一个Hello World项目 登录猫说:

  01-21 23:30:​​06.780:E / AndroidRuntime(939):致命异常:主要
01-21 23:30:​​06.780:E / AndroidRuntime(939):java.lang.UnsatisfiedLinkError中:
本机方法未找到:com.example.ndktesting.MainActivity.invokeNativeFunction :()Ljava /朗/字符串;
 

我查了一些计算器答案,但找不到我answer.Here是我的code for Java和CI正在使用的Andr​​oid NDK r8d版本。

  // ndktest.c

#包括< string.h中>
#包括< jni.h>

为externC
{
JNIEXPORT的jstring JNICALL Java_com_example_ndktesting_ndktest_MainActivity_invokeNativeFunction(JNIEnv的* ENV,jobject THIZ)
};

JNIEXPORT的jstring JNICALL Java_com_example_ndktesting_ndktest_MainActivity_invokeNativeFunction(JNIEnv的* ENV,jobject THIZ)
{
返回(* ENV) - > NewStringUTF(ENV,你好从本地code!);
}
 

下面是我的MainActivity的java code

 包com.example.ndktesting;

公共类MainActivity扩展活动
{
//声明本土code函数 - 必须匹配ndktest.c
私人本地字符串invokeNativeFunction();

公共本地字符串unimplementedinvokeNativeFunction();

//加载库 - 名称相匹配的JNI / Android.mk
静止
{
的System.loadLibrary(ndktest);
}

@覆盖
保护无效的onCreate(包savedInstanceState)
{
super.onCreate(savedInstanceState);
的setContentView(R.layout.activity_main);

//这是我们调用本机code
字符串Hello = invokeNativeFunction();

新AlertDialog.Builder(本).setMessage(你好).show();
}
}
 

安卓使文件code:

  LOCAL_PATH:= $(叫我-DIR)

包括$(CLEAR_VARS)

#在这里,我们给我们的模块名称和源文件(S)
LOCAL_MODULE:= ndktest
LOCAL_SRC_FILES:= ndktest.c

包括$(BUILD_SHARED_LIBRARY)
 

解决方案

您封装/类名称不匹配。

  JNIEXPORT的jstring JNICALL Java_com_example_ndktesting_ndktest_MainActivity_invokeNativeFunction(JNIEnv的* ENV,jobject THIZ)
 

将在类中的方法

  com.example.ndktesting.ndktest.MainActivity
 

不过实际code

 包com.example.ndktesting;

公共类MainActivity扩展活动
 

将导致它来寻找

  com.example.ndktesting.MainActivity.invokeNativeFunction
 

没有ndktest

一旦你的名字匹配它要么工作,或使下一个问题。

I am trying to build android application using native code so i want to test if ndk runs successfully.When i try to run my first hello world project log cat says,

01-21 23:30:06.780: E/AndroidRuntime(939): FATAL EXCEPTION: main
01-21 23:30:06.780: E/AndroidRuntime(939): java.lang.UnsatisfiedLinkError: 
Native method not found: com.example.ndktesting.MainActivity.invokeNativeFunction:()Ljava/lang/String;

I checked some stackoverflow answers but could not find my answer.Here is my code for java and c.I am using android ndk r8d version.

//ndktest.c

#include <string.h>
#include <jni.h>

extern "C"
{
JNIEXPORT jstring JNICALL   Java_com_example_ndktesting_ndktest_MainActivity_invokeNativeFunction(JNIEnv* env, jobject  thiz)
};

JNIEXPORT jstring JNICALL   Java_com_example_ndktesting_ndktest_MainActivity_invokeNativeFunction(JNIEnv* env, jobject  thiz)
{
return (*env)->NewStringUTF(env, "Hello from native code!");
}

Here is my MainActivity java code

package com.example.ndktesting;

public class MainActivity extends Activity 
{   
//declare the native code function - must match ndktest.c
private native String invokeNativeFunction();

public native String  unimplementedinvokeNativeFunction();

// load the library - name matches jni/Android.mk 
static 
{
System.loadLibrary("ndktest");
}

@Override
protected void onCreate(Bundle savedInstanceState) 
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// this is where we call the native code
String hello = invokeNativeFunction();

new AlertDialog.Builder(this).setMessage(hello).show();
}
}

Android make file code:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

# Here we give our module name and source file(s)
LOCAL_MODULE    := ndktest
LOCAL_SRC_FILES := ndktest.c

include $(BUILD_SHARED_LIBRARY)

解决方案

Your package/class names do not match.

JNIEXPORT jstring JNICALL   Java_com_example_ndktesting_ndktest_MainActivity_invokeNativeFunction(JNIEnv* env, jobject  thiz)

Would be a method in the class

com.example.ndktesting.ndktest.MainActivity

However your actual code

package com.example.ndktesting;

public class MainActivity extends Activity 

causes it to look for

com.example.ndktesting.MainActivity.invokeNativeFunction

without the "ndktest"

Once you make the names match it should either work, or expose the next issue.

这篇关于没有发现的Andr​​oid NDK本地方法错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆