栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JNI之java调用c库简单实例

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JNI之java调用c库简单实例

一、适用:

因为架构迁移或者开发需要,有时候需要在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、大功告成

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/708790.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号