NDK无法加载库

时间:2014-04-07 12:12:21

标签: android android-ndk

我正在尝试使用NDK制作一个最简单的HelloWorld,但显然我错过了一些东西。我尝试了3个不同的教程,每次我得到相同的错误(UnsatisfiedLinkError并且无法从加载器加载ndk1)。所以让我解释一下:

我使用ADT Eclipse作为我的Android环境。我已经安装了C / C ++,我已经下载了NDK。并将路径添加为

export ANDROID_SDK="/Applications/adt-bundle-mac-x86_64-20131030/sdk"
export ANDROID_NDK="/Applications/adt-bundle-mac-x86_64-20131030/android-ndk-r9d"
export PATH="$PATH:$ANDROID_SDK/tools:$ANDROID_SDK/platform-tools:$ANDROID_NDK"

然后我在Eclipse中创建一个名为AndroidNDK1Sample的项目。包名称为com.mamlambo.sample.ndk1 活动名称是AndroidNDK1SampleActivity,这是它的内容:

package com.mamlambo.sample.ndk1;

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

public class AndroidNDK1SampleActivity extends Activity {

private native void helloLog(String logThis);

static {
    System.loadLibrary("ndk1");
}

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

    helloLog("This will log to LogCat via the native call.");
}

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

}

我在项目的根目录中创建了一个jni文件夹,在其中我有2个文件:Android.mk和native.c

Android.mk内容:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_LDLIBS := -llog

LOCAL_MODULE    := ndk1
LOCAL_SRC_FILES := native.c

include $(BUILD_SHARED_LIBRARY)

native.c内容:

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

#define DEBUG_TAG "NDK_AndroidNDK1SampleActivity"

void Java_com_mamlambo_sample_ndk1_AndroidNDK1SampleActivity_helloLog(JNIEnv * env, jobject this, jstring logThis)
{
    jboolean isCopy;
    const char * szLogThis = (*env)->GetStringUTFChars(env, logThis, &isCopy);

    __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "NDK:LC: [%s]", szLogThis);

    (*env)->ReleaseStringUTFChars(env, logThis, szLogThis);
}

所以在这一点上,如果我没有弄错,编码部分已经结束了,现在我的终端我转到项目的根目录并运行ndk-build,结果是:

Android NDK: WARNING: APP_PLATFORM android-19 is larger than android:minSdkVersion 4 in ./AndroidManifest.xml    
[armeabi] Compile thumb  : ndk1 <= native.c
[armeabi] SharedLibrary  : libndk1.so
[armeabi] Install        : libndk1.so => libs/armeabi/libndk1.so

在我看来,警告与它无关。我在eclipse中清理了项目,然后运行它。我收到类似UnsatisfiedLinkError的错误,无法从加载器加载ndk1。

任何提示都会非常感激。

提前致谢。

3 个答案:

答案 0 :(得分:1)

前面使用JNIEXPORT

void Java_com_mamlambo_sample_ndk1_AndroidNDK1SampleActivity_helloLog(JNIEnv * env,jobject this,jstring logThis)

像这样

JNIEXPORT void Java_com_mamlambo_sample_ndk1_AndroidNDK1SampleActivity_helloLog(JNIEnv * env,jobject this,jstring logThis)

答案 1 :(得分:0)

我刚刚发现为什么所有这些都无效。我在运行在Intel Atom CPU上的计算机上的模拟器上启动了应用程序,但NDK仅适用于ARM。改变它现在一切正常。

答案 2 :(得分:0)

<强> MainActivity.java

myNDK.helloLog("This will log to LogCat via the native call.");

static 
{
        System.loadLibrary("MyLibrary");
}

public native void helloLog(String logThis); 

<强> Java_com_example_ndkmydemo_MyNDK.h

JNIEXPORT void JNICALL Java_com_example_ndkmydemo_MyNDK_helloLog
  (JNIEnv *, jobject , jstring);

<强> MyLibrary.cpp

JNIEXPORT void JNICALL Java_com_example_ndkmydemo_MyNDK_helloLog(JNIEnv * env, jobject obj, jstring logThis)
{
    jboolean isCopy;
    const char * szLogThis = env->GetStringUTFChars( logThis, &isCopy);

    __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "NDK:LC: [%s]", szLogThis);

    env->ReleaseStringUTFChars(logThis, szLogThis);
}