如何将底层C++库包装成Java类供上层APP调用?(就像使用Android SDK一样)
上层Java APP如何调用底层C++ Code?(就像使用Android SDK一样)比如我用C++调用Linux系统中的API来封装File族函数功能,现在想对上面的APP提供一个叫File的Java类。一般怎么做。(只是比喻)
现在想开发下图红色粗框中的部分供上层调用,不知道需要做哪些事,用什么方法技术?
--------------------编程问答-------------------- 尝试使用JNI的方法调用。
没有试过,不知道结果会怎么样。 --------------------编程问答-------------------- 使用jni就可以实现的,具体可以参考一下android的源代码. --------------------编程问答-------------------- 扩充Framework , 利用JNI , 调用本地实现库 --------------------编程问答-------------------- 既然要用底层的c 为什么不直接使用ndk开发?
如果在app层频繁使用java封装的API 用jni函数调用底层的c 并不是一个很有效率的做法
就像你说的file 既然c给你了file 你就直接写c去用file不就好了
我觉得 尽量避免频繁使用jni调用c code
jni的效率真的不高 --------------------编程问答-------------------- 两种方案:
1.如楼上诸位所说,将其加入到framework中,通过jni方式调用。
2.使用System.loadLibrary(...),在程序中加载so库,直接调用其中的api。 --------------------编程问答--------------------
你好:
小弟新手。最近也在做这方面的研究。想问一下,这个两个方法有什么本质的不同吗?方法2不需要JNI 来封装一下吗?可以直接调用吗? --------------------编程问答--------------------
ndk也是用的jni吧 --------------------编程问答-------------------- 关键看做什么了,要从本质来看,你要知道c到底哪些比java有优势,比如数学运算,效率敏感的操作,因为有指针,内存可以手动的控制,对于文件读写方面其实 java 运行库也是底层的c,所以意义不大,jni执行次消耗不小的 --------------------编程问答-------------------- 恩 我的意思是 用jni把c封装成api使用 不如把所有可以用c处理的用ndk实现 不需要再自己添加api 个人意见
--------------------编程问答-------------------- google并不想维护多种api,ndk本身就支持c和c++以及数学库,部分socket以及opengl库,需要了自己可以添加,但ui是java写的,没啥好办法,自己diy吧 --------------------编程问答-------------------- 以下是JNI 的实现步骤:
1. 编写带有native 声明的方法的java 类
2. 使用javac 命令编译所编写的java 类
3. 使用javah ?jni java 类名生成扩展名为h 的头文件
4. 使用C/C++实现本地方法
5. 将C/C++编写的文件生成动态连接库
其实使用原生代码(C,C++)是很有用的,比如高性能和高保密的应用逻辑用C开发,可以提高效率,可重用性和安全性。最好是内存需求少,CPU需求多的应用。
NDK 是编译嵌入在Android 应用中的原生代码的工具,提供交叉编译。可以生成原生代码库,并将原生代码库嵌入APK应用中。
还有上面的问题,JNI是一种实现库的方式。loadLibrary是一种加载库的方式。
//android 中调用的代码
public class HelloJni extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
tv.setText( stringFromJNI() );
setContentView(tv);
}
public native String stringFromJNI();
public native String unimplementedStringFromJNI();
static {
System.loadLibrary("linhai-jni");
}
}
//NDK 中的代码
//用本地方法返回一个VM的String.
jstring Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,jobject thiz )
{
return (*env)->NewStringUTF(env, "Hello from JNI !");
}
--------------------编程问答--------------------
请大家回答一些这两个问题。 --------------------编程问答--------------------
请大家回答一下这两个关键问题 --------------------编程问答--------------------
请大家回答一下这两个关键问题
--------------------编程问答--------------------
说的很好 --------------------编程问答-------------------- 例子类:
public class File {
public native String getStringItem();
static {
System.loadLibrary("File");
}
}
用命令行生成C的头文件(先编译,com.test.jni是包名,例子,然后再生成头文件)。
javac com/test/jni/File.java
javah -jni com.test.jni.File
引用头文件,写c/c++代码,然后生成libFile.so文件(例子,lib是前缀,不可少)
创建android工程,在根目录下创建libs文件夹,在libs文件夹下创建armeabi文件夹,
将libFile.so文件放在armeabi文件夹下。
最后,正常调用File类的方法。
--------------------编程问答--------------------
你看下android核心块全是用jni的。。
补充:移动开发 , Android