NDK:02-调用第三方so文件

2019-01-19  本文已影响0人  放纵的卡尔

NDK调用第三方so文件

说明:此处的so可以是jni生成的或者纯净的C语言的动态库.关于生成.so可参看我的上篇文章.

  1. 导入第三方.so.需要新建jniLibs,必须是这个文件名,否则会找不到.so(最简单的方式)

    image
  2. 修改CmakeList文件.

    image
  3. 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})
    
  1. 此时,第三方导入完毕调取即可.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());
    }
    
    
  2. 调用代码如下:

    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();
    }
    
  1. OK.-->完成.
上一篇下一篇

猜你喜欢

热点阅读