Android-NDK编译和链接

时间:2012-09-26 20:44:59

标签: android android-ndk

我有一个java项目,现在我想添加一些NDK功能。

这是我的Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := android
LOCAL_CFLAGS    := -Wno-psabi
LOCAL_SRC_FILES := android.c
LOCAL_LDLIBS    := -L$(SYSROOT)/usr/lib -llog

include $(BUILD_SHARED_LIBRARY)

这是我的android.c

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

#define DEBUG_TAG "NDK_AndroidNDK1SampleActivity"  

void Java_ru_tonybo_app_NativeRenderer_print(JNIEnv* env, jobject thiz, jstring message) {
    jboolean isCopy;  
    const char * szMessage = (*env)->GetStringUTFChars(env, message, &isCopy);

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

    (*env)->ReleaseStringUTFChars(env, message, szMessage);
}

这是我的相关java类

package ru.tonybo.app;

public class NativeRenderer {
    public NativeRenderer (String message) {
        print(message);
    }

    public native void print(String message);

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

通过cygwin进行NDK编译是好的

TonyBo@TonyBo-NoteBook /cygdrive/d/javaProjects/App_JNI/jni
$ /cygdrive/d/android-ndk-r8b/ndk-build -B
Cygwin         : Generating dependency file converter script
Compile thumb  : android <= android.c
SharedLibrary  : libandroid.so
Install        : libandroid.so => libs/armeabi/libandroid.so

libandroid.so已创建并放置在/libs/armeabi/libandroid.so

但是当我在设备上的eclipse中启动应用程序时,我在本机调用上UnsatisfiedLinkError获得了异常print(message);

我在这里失踪或做错了什么? 可能是我应该以某种方式告诉eclipse寻找共享库,如果是这样的话怎么做?

2 个答案:

答案 0 :(得分:3)

您选择的 libandroid 名称并不是一个好主意。库 / system / lib 中存在 libandroid.so 库。它已加载到您的应用中,因此您的Load()来电只会返回。如果您更改本机库的名称,一切都会很好。

答案 1 :(得分:1)

您需要从共享库中正确导出方法。在方法声明中使用JNIEXPORTJNICALL宏:

JNIEXPORT void JNICALL Java_ru_tonybo_app_NativeRenderer_print(...)