我正在尝试运行一个用C ++编写的简单因子程序,并将其链接到java UI。
这是我的Java代码
package com.lan.factorial;
public class FacLib
{
public native static long fac(long n);
static
{
System.loadLibrary("FacLib");
}
public static long facI(long n)
{
return fac(n);
}
}
`
这是我的C ++代码
#include <studio.h>
#include <jni.h>
#include "com_lan_factorial_FacLib.h"
JNIEXPORT jlong JNICALL Java_com_lan_factorial_FacLib_fac(JNIEnv *env, jclass, jlong)
{
jlong f = 1;
jlong i;
for(i = 1; i <= n; i++)
{
f *= i;
}
return f;
}
这是我的make文件
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := com_lan_factorial_main.cpp
LOCAL_MODULE := com_lan_factorial_FacLib
include $(BUILD_SHARED_LIBRARY)
我在运行ndk-build时遇到此错误:
C:\Users\Lan\workspace\Factorial>"..\..\temp\android\android-ndk-r8b\ndk-build"
make: *** No rule to make target `jni/com_lan_factorial_main.cpp', needed by `obj/local/armeabi/objs/com_lan_factorial_FacLib/com_lan_factorial_main.o'. Stop.
是的,我的NDK在另一个文件夹中,因此我必须使用..\..\
,但我不认为这是问题所在。我确实跑了javah
答案 0 :(得分:0)
正如@nneonneo指出的那样,.cpp
文件名的名称未在Android.mk
中正确列出。
现在第4行有一个编译问题:
JNIEXPORT jlong JNICALL Java_com_lan_factorial_FacLib_fac(JNIEnv *env, jclass, jlong)
^
您丢失了参数名称 n ,但您在第9行使用了它:
for(i = 1; i <= n; i++)
请注意,可以跳过您从未使用过的jclass
类型的第二个参数的名称。
我不确定您的编译器是否找到com_lan_factorial_FacLib.h
文件,但这不是问题:您可以完全删除此#include
语句,您的代码不会使用它。