0

我对Android的本机方面很陌生。我正在按照 Sylvain Ratabouil(PACKT Publishing)的“Android NDK 初学者指南”来学习原生开发的基础知识。我已经在书中遇到了一些问题,并通过谷歌搜索找到了答案。但似乎没有其他人有这个问题。下面是我的代码

MainActivity.java

package com.jni;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

public native String getMyData();
static{
    System.loadLibrary("mylib");
}

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

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

}

安卓.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := mylib
LOCAL_SRC_FILES := com_jni_MainActivity.c

include $(BUILD_SHARED_LIBRARY)

com_jni_MainActivity.c

#include "com_jni_MainActivity.h"

JNIEXPORT jstring Java_com_jni_MainActivity_getMyData(JNIEnv* pEnv, jobject pThis){
    return (*pEnv)->NewStringUTF(pEnv, "Sample Title");
}

com_jni_MainActivity.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_jni_MainActivity */

#ifndef _Included_com_jni_MainActivity
#define _Included_com_jni_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
#undef com_jni_MainActivity_MODE_PRIVATE
#define com_jni_MainActivity_MODE_PRIVATE 0L
#undef com_jni_MainActivity_MODE_WORLD_READABLE
#define com_jni_MainActivity_MODE_WORLD_READABLE 1L
#undef com_jni_MainActivity_MODE_WORLD_WRITEABLE
#define com_jni_MainActivity_MODE_WORLD_WRITEABLE 2L
#undef com_jni_MainActivity_MODE_APPEND
#define com_jni_MainActivity_MODE_APPEND 32768L
#undef com_jni_MainActivity_BIND_AUTO_CREATE
#define com_jni_MainActivity_BIND_AUTO_CREATE 1L
#undef com_jni_MainActivity_BIND_DEBUG_UNBIND
#define com_jni_MainActivity_BIND_DEBUG_UNBIND 2L
#undef com_jni_MainActivity_BIND_NOT_FOREGROUND
#define com_jni_MainActivity_BIND_NOT_FOREGROUND 4L
#undef com_jni_MainActivity_CONTEXT_INCLUDE_CODE
#define com_jni_MainActivity_CONTEXT_INCLUDE_CODE 1L
#undef com_jni_MainActivity_CONTEXT_IGNORE_SECURITY
#define com_jni_MainActivity_CONTEXT_IGNORE_SECURITY 2L
#undef com_jni_MainActivity_CONTEXT_RESTRICTED
#define com_jni_MainActivity_CONTEXT_RESTRICTED 4L
#undef com_jni_MainActivity_RESULT_CANCELED
#define com_jni_MainActivity_RESULT_CANCELED 0L
#undef com_jni_MainActivity_RESULT_OK
#define com_jni_MainActivity_RESULT_OK -1L
#undef com_jni_MainActivity_RESULT_FIRST_USER
#define com_jni_MainActivity_RESULT_FIRST_USER 1L
#undef com_jni_MainActivity_DEFAULT_KEYS_DISABLE
#define com_jni_MainActivity_DEFAULT_KEYS_DISABLE 0L
#undef com_jni_MainActivity_DEFAULT_KEYS_DIALER
#define com_jni_MainActivity_DEFAULT_KEYS_DIALER 1L
#undef com_jni_MainActivity_DEFAULT_KEYS_SHORTCUT
#define com_jni_MainActivity_DEFAULT_KEYS_SHORTCUT 2L
#undef com_jni_MainActivity_DEFAULT_KEYS_SEARCH_LOCAL
#define com_jni_MainActivity_DEFAULT_KEYS_SEARCH_LOCAL 3L
#undef com_jni_MainActivity_DEFAULT_KEYS_SEARCH_GLOBAL
#define com_jni_MainActivity_DEFAULT_KEYS_SEARCH_GLOBAL 4L
/*
 * Class:     com_jni_MainActivity
 * Method:    getMyData
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_jni_MainActivity_getMyData
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

当我尝试运行该程序时,它崩溃了。logcat 给出以下消息

10-08 10:38:36.093: E/AndroidRuntime(31641): FATAL EXCEPTION: main
10-08 10:38:36.093: E/AndroidRuntime(31641): java.lang.UnsatisfiedLinkError: Couldn't load mylib from loader dalvik.system.PathClassLoader[dexPath=/data/app/com.jni-1.apk,libraryPath=/data/app-lib/com.jni-1]: findLibrary returned null
10-08 10:38:36.093: E/AndroidRuntime(31641):    at java.lang.Runtime.loadLibrary(Runtime.java:365)
10-08 10:38:36.093: E/AndroidRuntime(31641):    at java.lang.System.loadLibrary(System.java:535)
10-08 10:38:36.093: E/AndroidRuntime(31641):    at com.jni.MainActivity.<clinit>(MainActivity.java:11)
10-08 10:38:36.093: E/AndroidRuntime(31641):    at java.lang.Class.newInstanceImpl(Native Method)
10-08 10:38:36.093: E/AndroidRuntime(31641):    at java.lang.Class.newInstance(Class.java:1319)
10-08 10:38:36.093: E/AndroidRuntime(31641):    at android.app.Instrumentation.newActivity(Instrumentation.java:1054)
10-08 10:38:36.093: E/AndroidRuntime(31641):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
10-08 10:38:36.093: E/AndroidRuntime(31641):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2354)
10-08 10:38:36.093: E/AndroidRuntime(31641):    at android.app.ActivityThread.access$600(ActivityThread.java:150)
10-08 10:38:36.093: E/AndroidRuntime(31641):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1244)
10-08 10:38:36.093: E/AndroidRuntime(31641):    at android.os.Handler.dispatchMessage(Handler.java:99)
10-08 10:38:36.093: E/AndroidRuntime(31641):    at android.os.Looper.loop(Looper.java:137)
10-08 10:38:36.093: E/AndroidRuntime(31641):    at android.app.ActivityThread.main(ActivityThread.java:5191)
10-08 10:38:36.093: E/AndroidRuntime(31641):    at java.lang.reflect.Method.invokeNative(Native Method)
10-08 10:38:36.093: E/AndroidRuntime(31641):    at java.lang.reflect.Method.invoke(Method.java:511)
10-08 10:38:36.093: E/AndroidRuntime(31641):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
10-08 10:38:36.093: E/AndroidRuntime(31641):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
10-08 10:38:36.093: E/AndroidRuntime(31641):    at dalvik.system.NativeStart.main(Native Method)
10-08 10:38:37.882: I/Process(31641): Sending signal. PID: 31641 SIG: 9

libs->armeabi 中有 libmylib.so。我不知道我做错了什么

4

2 回答 2

1

检查你的 Android.mk,你没有做任何事情来包含 com_jni_MainActivity.h 头文件。使用类似 Local_Includes 的东西

于 2013-10-08T05:48:02.763 回答
0

NDK里面有很多示例代码。您可以阅读它们并进行一些修改以进行练习。Android.mk 很容易理解。

于 2013-10-08T09:11:35.533 回答