我正在尝试使用NDK,我一直在使用官方样本开始。我设法让“Hello JNI”样本工作: https://github.com/googlesamples/android-ndk/tree/master/hello-jni
(我使用的是Android Studio)
但我不知道如何将源文件添加到项目中。因此,例如,提供的JNI函数是(我删除了对此无用的宏):
jstring Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
jobject thiz )
{
return (*env)->NewStringUTF(env, "Hello from JNI !");
}
假设我想从C函数“getString()”中获取字符串,定义如下:
const char* getString()
{
return "Hello from getString()";
}
//Then, JNI function becomes
jstring Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
jobject thiz )
{
return (*env)->NewStringUTF(env, getString());
}
如果我创建了一个getString.h,我在其中声明了该函数,并将实现放在我当前且只有一个源文件中,那么一切都像魅力一样。所以,标题确实有用。
但是,如果我创建一个GetString.c文件,我放置了实现,我的代码停止编译。我明白这是因为GetString.o没有链接(甚至编译?我不知道),但我不知道如何告诉Android Studio编译hello-jni.c(样本的源文件)和GetString.c
我应该弄脏手并修改gradle文件吗? 我还听说过一个名为Android.mk的文件,它就像一个makefile,但我还没有在项目中找到它。如果它是强制性的,我应该创建它,以及放入什么?如果不是,IDE如何知道他必须构建hello-jni.c? (AKA“在修改之前项目是如何配置的”)
如果您需要有关java端事物或gradle脚本的任何信息,请查看github链接:)
答案 0 :(得分:0)
嗯,一些测试足以证实我的想法。我只需要创建Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := hello-jni.c, GetString.cpp
LOCAL_MODULE := hello-jni
include $(BUILD_SHARED_LIBRARY)