Android-NDK开发之第四个例子--用C/C++调用Java

转载 2012年03月29日 17:52:55

用C/C++调用Java的方法我没有去研究,也不知道从哪里开始研究,对Linux我了解到很少,希望有朋友可以给些资料,我的水平很差,望大家多多包涵。

  这个例子是别人的代码,我忘记从来里弄来的了,先对原作者表示抱歉。同时代码也被我修改过,再次道歉。

  而此文和别的文章一样,只是作为我平时学习积累的验证。

 

  1. Android.mk文件:

LOCAL_SRC_FILES参数用空格隔开

 

  1. LOCAL_PATH:=$(call my-dir)  
  2. include $(CLEAR_VARS)  
  3. LOCAL_MODULE:=native   
  4. LOCAL_SRC_FILES:=geolo.cpp my_jni.h   
  5. include $(BUILD_SHARED_LIBRARY)  
 

 

2. geolo.cpp

先用FindClass方法找到java类,有点类似java的反射用LoadClass

再用CallObjectMethod方法调用Java类的函数。

  1. #include "my_jni.h"  
  2. jobject getInstance(JNIEnv* env, jclass obj_class){  
  3.     jmethodID construction_id = env->GetMethodID(obj_class, "<init>""()V");  
  4.     jobject obj = env->NewObject(obj_class, construction_id);  
  5.     return obj;  
  6. }  
  7. JNIEXPORT jstring JNICALL Java_com_easepal_geolo_CActivityMain_stringFromJNI(JNIEnv* env, jobject thiz){  
  8.    jstring str;  
  9.    jclass java_class = env->FindClass("com/easepal/geolo/CForCall");  
  10.     if (java_class == 0){  
  11.        return env->NewStringUTF("not find class!");  
  12.     }  
  13.    jobject java_obj = getInstance(env, java_class);  
  14.    if (java_obj == 0){  
  15.        return env->NewStringUTF("not find java OBJ!");  
  16.    }  
  17.    jmethodID java_method = env->GetMethodID(java_class, "GetJavaString""()Ljava/lang/String;");  
  18.    if(java_method == 0){  
  19.        return env->NewStringUTF("not find java method!");  
  20.    }  
  21.    str = (jstring)env->CallObjectMethod(java_obj, java_method);  
  22.    return str;  
  23. }  
 

 

3. my_jni.h

 

  1. /* DO NOT EDIT THIS FILE - it is machine generated */  
  2. #include <jni.h>  
  3. /* Header for class com_easepal_geolo_CActivityMain */  
  4. #ifndef _Included_com_easepal_geolo_CActivityMain  
  5. #define _Included_com_easepal_geolo_CActivityMain  
  6. #ifdef __cplusplus  
  7. extern "C" {  
  8. #endif  
  9. /* 
  10. * Class:     com_easepal_geolo_CActivityMain 
  11. * Method:    stringFromJNI 
  12. * Signature: ()Ljava/lang/String; 
  13. */  
  14. JNIEXPORT jstring JNICALL Java_com_easepal_geolo_CActivityMain_stringFromJNI(JNIEnv *, jobject);  
  15. #ifdef __cplusplus  
  16. }  
  17. #endif  
  18. #endif  
 

 

4. CActivityMain.java

  1. package com.easepal.geolo;  
  2. import android.app.Activity;  
  3. import android.os.Bundle;  
  4. import android.widget.TextView;  
  5. public class CActivityMain extends Activity {  
  6.     /** Called when the activity is first created. */  
  7.     @Override  
  8.     public void onCreate(Bundle savedInstanceState){  
  9.         super.onCreate(savedInstanceState);  
  10.         TextView tv = new TextView(this);  
  11.         tv.setText( stringFromJNI("hello") );  
  12.         setContentView(tv);  
  13.     }  
  14.       
  15.       
  16.     static {  
  17.         System.loadLibrary("native");  
  18.     }  
  19.     public native String stringFromJNI(String str);  
  20. }  
 

 

5. CForCall.java

  1. package com.easepal.geolo;  
  2. public class CForCall{  
  3.    public CForCall(){};  
  4.    //public ~CForCall(){};  
  5.    public String GetJavaString(){  
  6.        String str;  
  7.        str = "123456";  
  8.        return str;  
  9.    }  

Android开发中在JAVA中调用C/C++ native代码

Android 从Java调用C/C++ 当无法用 Java 语言编写整个应用程序时,JNI 允许您调用C/C++本机代码。在下列典型情况下,您可能决定使用本机代码: 希望用更低级...
  • koozxcv
  • koozxcv
  • 2016年03月03日 18:37
  • 3552

Java调用C/C++编写的第三方dll动态链接库

最近在用weka做一个数据挖掘相关的项目,不得不说,weka还是一个不错的开放源代码库,提供了很多最常用的分类和聚类算法。 在我的项目中要用到一个聚类算法,Affinity Propagation(A...
  • jianzhanger
  • jianzhanger
  • 2013年11月19日 09:23
  • 2759

Android Studio下用NDK,JNI技术实现java和C/C++互调(初探)

一、Andriod NDK原理什么是NDK(android native develop kits ):android 本地开发工具集 ,可以把c/c++ ->编译成一个 linux下可以执行的二进制...
  • pxhero2012
  • pxhero2012
  • 2016年10月26日 11:13
  • 1859

JNI_最简单的Java调用C/C++代码

JNI_最简单的Java调用C/C++代码 JNI,是Java Native Interface的简称,中文是“Java本地调用”。通过这种技术可以做到以下两点:Java程序中的函数可以调用Nativ...
  • wwj_748
  • wwj_748
  • 2014年06月02日 21:34
  • 22971

用java调用C或C++动态链接库原来如此简单

用java调用C或C++动态链接库原来如此简单
  • javaniuniu
  • javaniuniu
  • 2017年03月31日 11:30
  • 1288

Java调用C/C++ API 讲解及代码示例

我们知道Java是一种平台无关性的语言,平台对于上层的java代码来说是透明的,所以在多数时间我们是不需要调用本地方法,但是假如你遇到了以下情况,你可能就需要使用Java调用本地方法了: 你的J...
  • htb0556
  • htb0556
  • 2015年11月06日 14:10
  • 1173

Linux下C++调用Java简单实例(jni)

1. Java端,假设工作目录为/home 1)  z
  • lxf310
  • lxf310
  • 2014年10月15日 16:29
  • 3931

NDK基础(java ,c/c++, jni之间的关系及java和c/c++之间的相互调用)

1.java,c/c++,和jni之间的关系 java和c/c++可以相互调用,是因为java虚拟机中的JNI。简单的说就是用c/c++编写一个动态链接库让Java虚拟机去调用。(在windows...
  • lishihaojie
  • lishihaojie
  • 2015年05月28日 09:27
  • 929

使用JNI进行Java与C/C++语言混合编程(1)--在Java中调用C/C++本地库

JNI系列文章索引 使用JNI进行Java与C/C++语言混合编程(1)--在Java中调用C/C++本地库 使用JNI进行Java与C/C++语言混合编程(2)--在C/C+...
  • gao1440156051
  • gao1440156051
  • 2016年07月25日 19:05
  • 880

从 C/C++ 程序调用 Java 代码

JNI允许您从本机代码内调用 Java 类方法。 要做到这一点,通常必须使用 Invocation API 在本机代码内创建和初始化一个 JVM。 下列是您可能决定从 C/C++ 代码调用Java...
  • weiqubo
  • weiqubo
  • 2015年09月02日 17:54
  • 1840
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android-NDK开发之第四个例子--用C/C++调用Java
举报原因:
原因补充:

(最多只允许输入30个字)