动态注册报错

动态注册报错

在新版本中 java中定义如下:

package com.sprd.newndk;

public class NdkUtil {
   static {
       System.loadLibrary("changeCase");
   }
   public native String helloWord();
}

在cpp定义如下:

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

jstring native_hello(JNIEnv* env, jobject thiz) {
   return env->NewStringUTF("Hello jni");
}

static JNINativeMethod gMethods[] = { { "helloWord",
                                             "()Ljava/lang/String", (void *) native_hello}};
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) {
   JNIEnv* env = NULL;
   jint result = JNI_FALSE;

   //获取env指针
   if (vm->GetEnv((void**) &env, JNI_VERSION_1_6) != JNI_OK) {
       return result;
   }
   if (env == NULL) {
       return result;
   }
   //获取类引用
   jclass clazz = env->FindClass("com/sprd/newndk/NdkUtil");
   if (clazz == NULL) {
       return result;
   }
   //注册方法
   if (env->RegisterNatives(clazz, gMethods,
                            sizeof(gMethods) / sizeof(gMethods[0])) < 0) {
       return result;
   }
   //成功
   result = JNI_VERSION_1_6;
   return result;
}

在调试中报错,请老师帮忙看看

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

4回答
irista23 2017-11-28 14:33:52

根据报错信息有可能是指令代码没有执行,你试试把静态代码块修改下:

public class NdkUtil {
   NdkUtil(){
       System.loadLibrary("changeCase");
   }
   public native String helloWord();
}


  • 提问者 沙漠之狐am #1
    还是出现Crash,不知道能否上传工程,请老师帮忙看看,或者是新版的Android studio不支持静态注册
    2017-11-28 15:14:57
提问者 沙漠之狐am 2017-11-28 14:02:04

#include <jni.h>
#include <string>
#include <android/log.h>

extern "C"
JNIEXPORT jstring JNICALL
native_hello(JNIEnv *env, jobject instance) {
   // TODO
   return env->NewStringUTF("Hello jni");
}


static JNINativeMethod gMethods[] = {{"helloWord",
                                "()Ljava/lang/String", (void *) native_hello}};

JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
   JNIEnv* env;
   jint result = JNI_FALSE;
   if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
       return -1;
   }
   jclass clazz = env->FindClass("com/sprd/newndk/NdkUtil");
   if (clazz == NULL) {
       return result;
   }
   if (env->RegisterNatives(clazz, gMethods,
                            sizeof(gMethods) / sizeof(gMethods[0])) < 0) {
       return result;
   }
   // Get jclass with env->FindClass.
   // Register methods with env->RegisterNatives.

   return JNI_VERSION_1_6;
}

  • 提问者 沙漠之狐am #1
    按照这个修改,还是报错
    2017-11-28 14:19:48
好帮手慕雪 2017-11-27 17:12:38

static {       System.loadLibrary("changeCase");   }应该放在调用activity处而不是NdkUtil 中。

  • 提问者 沙漠之狐am #1
    将static { System.loadLibrary("changeCase"); }放在MainActivity还是爆出如下错误: 11-27 17:14:22.466 4030-4030/com.sprd.newndk E/art: No implementation found for java.lang.String com.sprd.newndk.NdkUtil.helloWord() (tried Java_com_sprd_newndk_NdkUtil_helloWord and Java_com_sprd_newndk_NdkUtil_helloWord__) 11-27 17:14:22.467 4030-4030/com.sprd.newndk D/AndroidRuntime: Shutting down VM 11-27 17:14:22.469 4030-4030/com.sprd.newndk E/AndroidRuntime: FATAL EXCEPTION: main Process: com.sprd.newndk, PID: 4030 java.lang.UnsatisfiedLinkError: No implementation found for java.lang.String com.sprd.newndk.NdkUtil.helloWord() (tried Java_com_sprd_newndk_NdkUtil_helloWord and Java_com_sprd_newndk_NdkUtil_helloWord__) at com.sprd.newndk.NdkUtil.helloWord(Native Method)
    2017-11-27 17:18:28
  • 好帮手慕雪 回复 提问者 沙漠之狐am #2
    你是放在C++中,不是C中吗?那前面加 extern "C" 了没
    2017-11-27 18:24:01
  • 提问者 沙漠之狐am 回复 好帮手慕雪 #3
    按您的建议,代码修改如下: #include <jni.h> #include <string> #include <android/log.h> extern "C" JNIEXPORT jstring JNICALL native_hello(JNIEnv *env, jobject instance) { // TODO return env->NewStringUTF("Hello jni"); } static JNINativeMethod gMethods[] = {{"helloWord", "()Ljava/lang/String", (void *) native_hello}}; JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) { JNIEnv* env; jint result = JNI_FALSE; if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) { return -1; } jclass clazz = env->FindClass("com/sprd/newndk/NdkUtil"); if (clazz == NULL) { return result; } if (env->RegisterNatives(clazz, gMethods, sizeof(gMethods) / sizeof(gMethods[0])) < 0) { return result; } // Get jclass with env->FindClass. // Register methods with env->RegisterNatives. return JNI_VERSION_1_6; } 还是会出现crash....
    2017-11-28 14:01:30
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
Android数据通信开发与应用2018版
  • 参与学习           人
  • 提交作业       147    份
  • 解答问题       687    个

本专题介绍了Android开发核心组件:广播、服务及全局应用。教会你如何使用AIDL、Thread、Socket、蓝牙解决进程线程间通信问题。利用Glide等实现异步加载及NDK原生代码开发。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师