0
点赞
收藏
分享

微信扫一扫

JNI之java调用c库简单实例

编程练习生J 2022-01-17 阅读 77

一、适用:

因为架构迁移或者开发需要,有时候需要在android应用开发中,调用已有的c语言开发库,此时可能需要用到JNI。

二、示例:

1、Android Studio安装“合适的”ndk版本、cmake

NDK 修订历史记录  |  Android NDK  |  Android Developers

 

 

2、在CMakeLists.txt中添加需要编译的文件、和需要导入的c语言库。

添加native-lib.cpp,编译成库local-lib

#https://blog.csdn.net/weixin_51380973
add_library( # Sets the name of the library.
             local-lib

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             native-lib.cpp
        )
target_include_directories(
        local-lib
        PRIVATE
        ${CMAKE_SOURCE_DIR}/include
)
target_include_directories(
        local-lib
        PRIVATE
        ${CMAKE_SOURCE_DIR}/../jniLibs/include
)

导入remote-c.so库,命名为 remote-lib

add_library(remote-lib SHARED IMPORTED)

set_property(TARGET remote-lib PROPERTY IMPORTED_NO_SONAME 1)
set_target_properties(remote-lib PROPERTIES IMPORTED_LOCATION
        ${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/remote-c.so)

target_link_libraries( # Specifies the target library.
                       local-lib
                       remote-lib)
#https://blog.csdn.net/weixin_51380973

3、使用java语言格式,添加Activity、Class

public class JNITestActivity extends AppCompatActivity {


        @Override
        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_xxx);
        JNITest();
        }

        public void JNITest(){
        new Thread(new Runnable() {
            @Override
            public void run() {                
                            //https://blog.csdn.net/weixin_51380973
                            callLocalJava();
                            
                        }  
            
        }).start();
    }

        
}
public class CallLocalTest {
         
    public static void callLocalJava(){
           
        callLocalCJNI();
    
    }

    //https://blog.csdn.net/weixin_51380973
    private static native int callLocalCJNI();

         
}

4、使用C++言格式编写cpp文件、.h文件

//https://blog.csdn.net/weixin_51380973 
//native-lib.cpp
//${CMAKE_SOURCE_DIR}/include 


JNIEXPORT jint JNICALL Java_com_your_packetName_CallLocalTest_callLocalCJNI(JNIEnv
*env,jobject obj){   

    jint i;

    i=callRemoteCLibFuction();
   

    return i;
}
//https://blog.csdn.net/weixin_51380973 
//main.h
//${CMAKE_SOURCE_DIR}/../jniLibs/include
//main.h内容参考remote-c.so中callRemoteCLibFuction所在头文件内容


int callRemoteCLibFuction();

5、大功告成

举报

相关推荐

0 条评论