使用与Android NDK共享的库

时间:2016-11-28 23:24:35

标签: android android-ndk shared-libraries

我在共享库中编译了一个C ++项目。我需要在Android中使用该库(.so文件)和NDK。

这个想法是其他人会编译C ++项目并给我.so文件,所以我不必在我的计算机上编译它。

我需要在我的Android.mk文件中引用.so文件,我尝试的所有解决方案都不起作用。那就是我被困住的地方。

所以:

  • 是否可以在不为每个平台创建一个共享库的情况下执行我所描述的内容?
  • 如何在Android.mk中引用我的.so库?我试过的所有解决方案都不起作用。

为了从头开始重现所有内容,我执行了以下步骤:

1°)创建一个HelloWorld C ++项目:

  • Test.h:

    #include <iostream>
    
    class Test {
    
        public:
    
        Test();
        ~Test();
    
        static std::string getTest();
    };
    
  • Test.cpp的:

    #include "Test.h"
    
    std::string Test::getTest()
    {
        return "Hey!!\n";
    }
    

2°)创建共享库:

g++ -Wall -shared -fPIC -o libTest.so Test.cpp

这给了我一个libTest.so文件,我可以在C ++项目中使用它。现在我想在Android项目中使用它。

3°)创建一个基本的空Android项目:

  • package:com.so.test
  • name:CppTest

4°)在MainActivity.java文件旁边创建一个“Test.java”文件,其中包含:

package com.so.test;

public class Test {

    static {
        System.loadLibrary("hellondk");
    }

    public native String getMessage();
}

5°)打开终端并:

cd /path/to/my/android/project/app/src/main/java
javac com/so/test/Test.java
javah com.so.test.Test

这将创建“com_so_test_Test.h”文件。

cd /path/to/my/android/project
mkdir jni
mv app/src/main/java/com_so_test_Test.h jni
touch jni/com_so_test_Test.cpp

6°)在“com_so_test_Test.cpp”文件中添加以下代码:

#include <jni.h>
#include <stdio.h>
#include "com_so_test_Test.h"
#include "Test.hpp"

JNIEXPORT jstring JNICALL Java_com_so_test_Test_getMessage(JNIEnv* env, jobject ob)
{
    return env->NewStringUTF(Test::getTest().c_str());
}

7°)复制在步骤1和步骤1中创建的“Test.h”和“libTest.so”文件。 2进入“jni”文件夹

8°)在“jni”文件夹中创建一个“Android.mk”文件,其中包含:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hellondk
LOCAL_SRC_FILES := com_so_test_Test.cpp
include $(BUILD_SHARED_LIBRARY)

9°)在“jni”文件夹中创建一个“Application.mk”文件,其中包含:

APP_STL := stlport_static

10°)返回终端,运行:

/path/to/your/ndk/ndk-build

这就是我陷入困境的一步。我需要在Android.mk中引用libTest.so文件,但我尝试的所有解决方案都不起作用。有什么想法吗?

编辑:这是我得到的错误:

[arm64-v8a] Compile++      : hellondk <= com_so_test_Test.cpp
[arm64-v8a] SharedLibrary  : libhellondk.so
./obj/local/arm64-v8a/objs/hellondk/com_so_test_Test.o: In function `Java_com_so_test_Test_getMessage':
/Users/timsandra/Desktop/CppTest/jni/com_so_test_Test.cpp:8: undefined reference to `Test::getTest()'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [obj/local/arm64-v8a/libhellondk.so] Error 1

0 个答案:

没有答案