我正在尝试编写一些使用 jni 的 android 应用程序。
我有一个 Activity 文件,它实例化另一个调用 jni 函数的类。
我的 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() ;
}
我的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_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))
但是我必须通过 ndk 构建 C 代码并制作一个 .so 文件。如果我取消注释最后一行,那么我的另一个 makefile 将被执行,但它无法找到位于同一目录中的 .cpp 文件。我得到一个错误没有规则来制作'/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)