NDK调用第三方so文件
说明:此处的so可以是jni生成的或者纯净的C语言的动态库.关于生成.so可参看我的上篇文章.
-
导入第三方.so.需要新建jniLibs,必须是这个文件名,否则会找不到.so(最简单的方式)
image -
修改CmakeList文件.
image -
CmakeList的文件内容
cmake_minimum_required(VERSION 3.4.1) add_library( share-lib#第三方so的名称 SHARED#动态库标志 IMPORTED)#导入第三方的标志 #注意这两个属性必须靠在一起,下边是对上边的解释. set_target_properties(share-lib #第三方so的名称 PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/libshare-lib.so)#设置.so的路径(必须) add_library( # Sets the name of the library. native-lib#jni的loadLibrary的名称 SHARED#动态库标志 native-lib.cpp)#jni的源文件 target_include_directories(native-lib PRIVATE ${CMAKE_SOURCE_DIR}/../myinclude #配置include的路径(如果需要使用.h文件的话) ) find_library( # Sets the name of the path variable. log-lib log) target_link_libraries( # 链接所有的.cpp .so,(.h文件不需要) native-lib share-lib#第三方so的名称 ${log-lib})
-
此时,第三方导入完毕调取即可.JNI调用代码如下:native-lib.c
#include <jni.h> #include <string> extern "C" std::string getMyString(); using namespace std; extern "C" JNIEXPORT jstring JNICALL Java_com_okay_usendkdemo_MainActivity_stringFromJNI( JNIEnv *env, jobject /* this */) { return env->NewStringUTF(getMyString().c_str()); }
-
调用代码如下:
public class MainActivity extends AppCompatActivity { // Used to load the 'native-lib' library on application startup. static { System.loadLibrary("native-lib"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Example of a call to a native method TextView tv = findViewById(R.id.sample_text); tv.setText(stringFromJNI()+"--"); } /** * A native method that is implemented by the 'native-lib' native library, * which is packaged with this application. */ public native String stringFromJNI(); }
- OK.-->完成.
网友评论