为Android JNI应用程序编写和包含C ++类

时间:2016-06-23 15:20:29

标签: android gradle android-ndk java-native-interface

我是使用Android NDK和JNI的新手,但在Java和C ++方面都有经验。我正在尝试构建一个MWE,它表明本地运行循环方法比在java类上运行更快。我导入了hello-jni示例,将JNI代码转换为C ++兼容,并按预期运行。

在同一个项目中,我删除了示例代码并重新启动但未更改构建设置。为了比较性能,我创建了两个相同的类,它们对整数和数组进行循环操作。我有一个名为TestClassJava的Java类和一个名为.h类的C ++类(通过.cppTestClassCpp文件)。这些课程如下:

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

很明显,它不知道这堂课。因此,我假设在构建时,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构建我创建的类并将其链接到我正在加载的库中?

0 个答案:

没有答案