0

jniを利用してAndroidアプリを作成しようとしています。

jni関数を呼び出す別のクラスをインスタンス化するActivityファイルが1つあります。

私の cpp コードは問題なくビルドされており、libs/armeabi/libAppList.soに配置されています。

私のJavaファイルはこのようなものです。

package com.example.applist;

public class Backend {
    static {

        try {
            System.loadLibrary("AppList");
        } catch(Exception e) {
            Log.d("Backend","caught exception" + e);
        }

    }        

    public native int createGroup() ;
}

そして私のメイクファイルは以下のようなものです

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

#Only compile source java files in this apk.

LOCAL_SRC_FILES := $(call all-java-files-under, src)

LOCAL_PACKAGE_NAME := AppList

LOCAL_CERTIFICATE := platform

include $(BUILD_PACKAGE)
LOCAL_PREBUILT_LIBS := libs/armeabi/libAppList.so
include $(BUILD_MULTI_PREBUILT)

テストのために、メインのアクティビティ クラスからこのクラスをインスタンス化しています。(new Backend();) しかし、実行時エラーが発生します。誰かが私が間違っていることを説明できますか? 私はこれについての新しい学習者です。

# 編集: 正しい makefile の書き方がわかりました。ここにあります:

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
# Only compile source java files in this apk.
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_REQUIRED_MODULES := libAppListBack
LOCAL_SHARED_LIBRARIES := libAppListBack
LOCAL_PACKAGE_NAME := AppListNew
LOCAL_CERTIFICATE := platform
include $(BUILD_PACKAGE)

include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_PREBUILT_LIBS := libAppListBack:libs/armeabi/libAppListBack.so
include $(BUILD_MULTI_PREBUILT)

#include $(call all-makefiles-under,$(LOCAL_PATH))

ただし、C コードは ndk を使用してビルドし、.so ファイルを作成する必要があります。最後の行のコメントを外すと、他のメイクファイルが実行されますが、同じディレクトリにある .cpp ファイルを見つけることができません。No rule to make '/Backend.cpp'. というエラーが表示されます。誰でもそれを手伝ってもらえますか?

次のようになります。

LOCAL_PATH := $(call my-dir)  
include $(CLEAR_VARS)  
LOCAL_MODULE    := AppListBack
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog 
LOCAL_SRC_FILES := Backend.cpp
LOCAL_C_INCLUDES += $(JNI_H_INCLUDE)
LOCAL_MODULE_TAGS := optional
#LOCAL_PRELINK_MODULE := false

include $(BUILD_SHARED_LIBRARY)  
4

1 に答える 1

0

Makefile (Android.mk) で Java をコンパイルしないでください。Ant を使用してアプリの Java 部分をビルドする必要があります。さらに簡単 - Google の ADT バンドルのような GUI 環境を使用します。ndk-build ステップを実行することもできます。

于 2013-08-07T20:07:45.047 に答える