我正在尝试使用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。
任何提示都会非常感激。
提前致谢。
答案 0 :(得分:1)
在
前面使用JNIEXPORTvoid 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);
}