美文网首页Android JNI专题
第十一节(引入三方的so库)

第十一节(引入三方的so库)

作者: 最美下雨天 | 来源:发表于2017-10-03 18:52 被阅读19次

    我们建两个工程来模拟一下这个过程:
    1.在一个工程中生成所需so文件
    2.将so文件导入到另外一个工程中
    3.调用so里面的方法。

    第一步

    第一个工程中的代码:

    image.png

    看下生成的so文件:

    image.png

    第二步

    我们修改下第二个工程默认的so文件的名称(因为用androidstudio新建的工程默认的so文件的名称都是native-lib)
    CMakeLists.txt修改

    cmake_minimum_required(VERSION 3.4.1)
    
    #系统的
    find_library(
                  log-lib
    
    
                  log )
    
     #设置so库路径
     set(my_lib_path ${CMAKE_SOURCE_DIR}/libs)
     #讲第三方库作为动态库引用
     add_library( native-lib
                  SHARED
                  IMPORTED )
    
     #指名第三方库的绝对路径
     set_target_properties( native-lib
                            PROPERTIES IMPORTED_LOCATION
                            ${my_lib_path}/${ANDROID_ABI}/libnative-lib.so )
     add_library(
                 native2-lib
    
    
                 SHARED
    
    
                 src/main/cpp/native2-lib.cpp )
    
    
    
    
    
    target_link_libraries(
                           native2-lib
    
                           native-lib
    
    
                           ${log-lib} )
    

    第三步

    1.导入so文件到第二个项目,放入libs下面
    2.在build.gradle文件中的android标签下的defaultConfig下面写入:

     sourceSets.main {
                jniLibs.srcDirs = ['libs']
                jni.srcDirs = []
            }
    
    image.png image.png

    native2-lib.cpp

    #include <jni.h>
    #include "native-head.h"
    
    extern "C"
    JNIEXPORT jint JNICALL
    Java_com_example_huozhenpeng_myapplication_MainActivity_stringFromJNITest(JNIEnv *env,
                                                                              jobject instance, jint a,
                                                                              jint b) {
    
        return addFromJNI(a,b);//这儿调用的外部so库中的方法
    
    }
    
    
    package com.example.huozhenpeng.myapplication;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.widget.TextView;
    
    public class MainActivity extends AppCompatActivity {
    
        // Used to load the 'native-lib' library on application startup.
        static {
            System.loadLibrary("native2-lib");
            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 = (TextView) findViewById(R.id.sample_text);
            tv.setText(""+addFromJNI(10,29));
        }
    
        /**
         * A native method that is implemented by the 'native-lib' native library,
         * which is packaged with this application.
         */
        public native int addFromJNI(int a,int b);
    }
    
    

    调用测试:

    image.png

    相关文章

      网友评论

        本文标题:第十一节(引入三方的so库)

        本文链接:https://www.haomeiwen.com/subject/sdwxyxtx.html