我是使用Android NDK和JNI的新手,但在Java和C ++方面都有经验。我正在尝试构建一个MWE,它表明本地运行循环方法比在java类上运行更快。我导入了hello-jni示例,将JNI代码转换为C ++兼容,并按预期运行。
在同一个项目中,我删除了示例代码并重新启动但未更改构建设置。为了比较性能,我创建了两个相同的类,它们对整数和数组进行循环操作。我有一个名为TestClassJava
的Java类和一个名为.h
类的C ++类(通过.cpp
和TestClassCpp
文件)。这些课程如下:
public class TestClassJava {
// Fields
private int id;
private int[] array;
// Constructor
public TestClassJava(int start_id) { // etc... }
// Methods
public void incrementId() { // etc... }
public void labelArray() { // etc... }
public void loop() {
while (id < 5000000) {
incrementId();
labelArray();
}
}
}
C ++标题:
class TestClassCpp {
private:
int id;
int array[10];
public:
TestClassCpp(int start_id);
~TestClassCpp();
void incrementId();
void labelArray();
void loop();
};
然后是.cpp
#include "TestClassCpp.h"
// Constructor / Destructor
TestClassCpp::TestClassCpp(int start_id) { // etc... }
TestClassCpp::~TestClassCpp() { }
// Methods
void TestClassCpp::incrementId() { // etc... }
void TestClassCpp::labelArray() { // etc... }
void TestClassCpp::loop() {
while (id < 5000000) {
incrementId();
labelArray();
}
}
在与头文件和cpp文件相同的jni目录中我有一个名为testclasswrapper.cpp
的文件,其中包含MainActivity
中的java与{{1}之间的接口代码} TestClassCpp
方法。在loop()
我添加了
MainActivity
static {
System.loadLibrary("testclasswrapper");
}
public native void nativeLooper();
在nativeLooper()
文件中声明为
testclasswrapper.cpp
应用程序构建和部署但无法找到具有JNIEXPORT void JNICALL
Java_com_example_jnimwe_MainActivity_nativeLooper(JNIEnv *env, jobject instance) {
// Get class
jclass cls = env->FindClass("TestClassCpp");
// Get method id of constructor
jmethodID constructor_method_id = env->GetMethodID(cls, "<init>", "(I)V" );
// Instantiate object from C++ definition
jobject jobj = env->NewObject(cls,constructor_method_id);
// Get loop method id from object
jmethodID mid = env->GetMethodID(cls,"loop","()V");
// Loop
env->CallVoidMethod(jobj,mid);
}
的类。我在jclass cls = env->FindClass("TestClassCpp");
文件中添加了moduleName
testclasswrapper
。
错误是
build.gradle
JNI DETECTED ERROR IN APPLICATION: JNI GetMethodID called with pending exception 'java.lang.ClassNotFoundException' thrown in unknown throw location
06-23 16:07:14.617 12131-12131/com.example.jnimwe A/art: art/runtime/check_jni.cc:64] in call to GetMethodID
)构建而不是搜索所有文件并构建和链接所有文件。添加testclasswrapper.cpp
testclasswrapper.cpp`是灰色的,因此不会以这种方式包含类的定义。
原始#include "./TestClassCpp.h" in the
示例使用ndk-build构建,据我所知。类似的答案都是指一个名为hello-jni
的makefile。 hello-jni示例中没有makefile,因此我的示例中没有makefile 。如何告诉gradle构建我创建的类并将其链接到我正在加载的库中?