我在共享库中编译了一个C ++项目。我需要在Android中使用该库(.so文件)和NDK。
这个想法是其他人会编译C ++项目并给我.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项目:
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