2

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に指示する必要があるかもしれません。そうであれば、これを行う方法は?

4

2 に答える 2

3

libandroidの名前を選択するのは良い考えではありません。ライブラリlibandroid.soは、システムフォルダ/ system/libにあります。それはあなたのアプリにロードされるので、あなたのLoad()呼び出しは単に戻ります。ネイティブライブラリの名前を変更すると、すべてがうまくいきます。

于 2012-09-27T09:32:58.293 に答える
1

メソッドを共有ライブラリから適切にエクスポートする必要があります。メソッド宣言でJNIEXPORTおよびマクロを使用します。JNICALL

JNIEXPORT void JNICALL Java_ru_tonybo_app_NativeRenderer_print(...)
于 2012-09-27T10:38:42.320 に答える