0:前言html
1:本文主要做为丙方android公司的身份来写java
2:做者有不对的地方,请指出,谢谢
android
[第一篇:android利用jni调用第三方库——编写库libhello.so]app
[第二篇:android利用jni调用第三方库——编写库android程序直接调用第三方库libhello.so]ide
[第三篇:android利用jni调用第三方库——编写库android程序整合第三方库libhello.so到本身的库libhelloword.so]函数
1:场景:公司接到任务,说配合乙方C++公司开发android识别程序,项目布置到项目经理,而后经理把任务交给你来作,你天然是先抱怨一番,活多钱少让我这新人来干,哎没办法啊,干吧!ui
2:东西:乙方C++公司交给个人东西有this
libhello.so库文件 com_hello_hello_HelloActivity.h头文件(有可能没有这个,我是死命要来的) 库的接口说明文档
3:搞起:spa
com_hello_hello_HelloActivity.h //符合jni的规范,前面com_hello_hello是包名,后面HelloActivity是类名,注意在丙方这里叫类名,在乙方那里叫Activity的名字可以看出来他的包结构,而后就创建一个和他同样的包,在这个包中新建一个和他同样的类,类中的方法按照jni规范可以得出来是什么,好比
JNIEXPORT jstring JNICALL Java_com_hello_hello_HelloActivity_sayHello(JNIEnv *, jclass);//其中有一个方法是无参数函数sayHello结构如图
package com.hello.hello;
import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
public class HelloActivity {
// static
// {
// System.loadLibrary("hello"); //实验证实在这里不须要引入包名也是能够的
// }
public static native String sayHello(); // 第三方库函数
}
package com.hello.word; import com.hello.hello.HelloActivity; import android.app.Activity; import android.app.AlertDialog; import android.os.Bundle; public class Helloword2Activity extends Activity { static { System.loadLibrary("hello"); //引入包名 } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); new AlertDialog.Builder( this ).setMessage(new HelloActivity().sayHello()).show();//实例化类方法直接调用 } }
4:下载demo[猛戳这里下载demo]
.net