ndk构建和.so文件创建android

问题描述:

我是新的android ndk。ndk构建和.so文件创建android

我工作的这需要Java代码以及C/C++代码

因此,一个应用程序,为我需要的Android NDK。

但我坚持在这一点上,我不能运行NDK建造这使得Java和C/C++之间的连接。

所以。请有人帮我解决这个问题。

我试过在Windows和Linux上,但得到同样的错误。

我得到这个错误,当我使用ndk构建。

/home/kamal/android-ndk-r8e/build/core/add-application.mk:128: Android NDK:  
Compile thumb : ndk <= native.c 
jni/native.c: In function 'Java_com_example_demo_MainActivity_hello': 
jni/native.c:4:3: error: parameter name omitted 
jni/native.c:4:3: error: parameter name omitted 
jni/native.c:5:10: error: 'env' undeclared (first use in this function) 
jni/native.c:5:10: note: each undeclared identifier is reported only once for each    function it appears in 
jni/native.c: In function 'Java_com_example_demo_MainActivity_add': 
jni/native.c:9:3: error: parameter name omitted 
jni/native.c:9:3: error: parameter name omitted 
jni/native.c:9:3: error: parameter name omitted 
jni/native.c:9:3: error: parameter name omitted 
jni/native.c:10:9: error: 'value1' undeclared (first use in this function) 
jni/native.c:10:18: error: 'value2' undeclared (first use in this function) 
make: *** [obj/local/armeabi/objs/myjni/native.o] Error 1 

首先你是因为你没有声明参数是必须创建Java和C/C++之间的连接如收到此错误。

所以,我送你我的代码为您的问题

所有1.首先在Eclipse中创建Android项目。

  1. 创建项目文件夹点击 - >点击新建 - >然后文件夹并命名为jni。

  2. 下JNI nameing再创建一个文件夹中包含。

  3. 创建java类。为java类nameing-(MainActivity.java)

  4. 代码 - >

    package com.example.ndk; 
    
    import android.os.Bundle; 
    import android.app.Activity; 
    import android.view.Menu; 
    
    public class MainActivity extends Activity { 
    
    static { 
        System.loadLibrary("myjni"); 
        } 
    
    /** 
    * Adds two integers, returning their sum 
    */ 
    public native int add(int v1, int v2); 
    
    /** 
    * Returns Hello World string 
    */ 
    public native String hello(); 
    
    
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
    } 
    
        } 
    
  5. 开放命令提示或按窗口+ R。

  6. 移动到目录 - (workspace->项目名称 - > JNI - >包括)。

  7. 在此目录下运行命令。

    javah -classpath <project-name>/bin/classes;<ANDROID_SDK_HOME>\platforms\android-<xx>\android.jar -o HelloJNI.h com.example.test.MainActivity 
    
  8. 此后我们可以在include文件夹下看到“HelloJNI.h”文件。

  9. 检查 “HelloJNI.h” 有它的

    JNIEXPORT jint JNICALL Java_com_example_ndk_MainActivity_add(JNIEnv *, jobject, jint, jint); 
    
    JNIEXPORT jstring JNICALL Java_com_example_ndk_MainActivity_hello (JNIEnv *, jobject); 
    
  10. 下创建JNI命名test.c的(在此文件test.c的使用蓬10这2个点)

    新文件,该行
    #include <jni.h> 
        #include "include/HelloJNI.h" 
    
    JNIEXPORT jstring JNICALL Java_com_example_ndk_MainActivity_hello 
        (JNIEnv *env, jobject javaThis) { 
        return (*env)->NewStringUTF(env, "Hello"); 
    } 
    
        JNIEXPORT jint JNICALL Java_com_example_ndk_MainActivity_add 
         (JNIEnv *env, jobject javaThis, jint value1, jint value2){ 
    return (value1 + value2); 
        } 
    
  11. 创建命名的Android JNI下的新文件。MK

    LOCAL_PATH := $(call my-dir) 
    
    include $(CLEAR_VARS) 
    
    LOCAL_MODULE := myjni  // from point 5 
    LOCAL_SRC_FILES := test.c  //from point 10 that we creare test.c 
    
    include $(BUILD_SHARED_LIBRARY) 
    
  12. 创建PROMT

在命令新文件NDKActivity.java

package com.example.ndk; 

    import android.app.Activity; 
    import android.view.View.OnClickListener; 
    import android.os.Bundle; 
    import android.view.View; 
    import android.widget.Button; 
    import android.widget.EditText; 
    import android.widget.TextView; 

    public class NDKActivity extends Activity{ 

    Button buttonCalc; 
    TextView result; 
    EditText value1,value2; 
    /** Called when the activity is first created. */ 
    MainActivity nativeLib; 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
nativeLib = new MainActivity(); 
    String helloText = nativeLib.hello(); 

result = (TextView) findViewById(R.id.result); 
value1 = (EditText) findViewById(R.id.value1); 
value2 = (EditText) findViewById(R.id.value2); 

// Update the UI 
TextView outText = (TextView) findViewById(R.id.textOut); 
outText.setText(helloText); 

// Setup the UI 
buttonCalc = (Button)this.findViewById(R.id.buttonCalc); 

buttonCalc.setOnClickListener(new OnClickListener() { 


public void onClick(View v) { 
int v1, v2, res = -1; 
v1 = Integer.parseInt(value1.getText().toString().trim()); 
v2 = Integer.parseInt(value2.getText().toString().trim()); 

res = nativeLib.add(v1, v2); 
result.setText(new Integer(res).toString()); 
} 



}); 
} 
    } 
  • 运行NDK建造转到项目目录 - >然后,写这个命令<android-ndk-directory>\ndk-build.cmd和点击进入

    此后我们可以检查.so文件nder obj文件夹

    1. xml file for NDKActivity。

      <TextView android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="Vikram" 
      android:textSize="22sp"/> 
      <TextView android:id="@+id/textOut" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="Output"/> 
      
      <EditText 
      android:id="@+id/value1" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:hint="Value 1" 
      android:inputType="numberDecimal" /> 
      
      <TextView android:id="@+id/TextView01" 
          android:layout_width="fill_parent" 
          android:layout_height="wrap_content" 
          android:text="+" 
          android:textSize="36sp" /> 
      
           <EditText 
          android:id="@+id/value2" 
          android:layout_width="fill_parent" 
          android:layout_height="wrap_content" 
          android:hint="Value 2" 
          android:inputType="numberDecimal" /> 
      
      <Button android:id="@+id/buttonCalc" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="=" /> 
      <TextView android:id="@+id/result" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="result" 
          android:textSize="36sp" /> 
      
      
          </LinearLayout> 
      
  • +0

    感谢Vikram,它解决了我的问题 –

    +0

    @Vikram ...当我尝试运行javah -classpath /bin/classes; \ platforms \ android- \ android.jar - HelloJNI.h com.example.test.MainActivity ......我在控制台“main”中得到这个异常java.lang.NullPointerException \t at sun.launcher.LauncherHelper.getMainClassFromJar(Unknown Source) \t at sun .launcher.LauncherHelper.checkAndLoadMain(Unknown Source) – DJhon

    +0

    不错的答案!谢谢你,兄弟!!!只需要修改一次Gradle项目。在第7点,我们应该使用 \ build \ intermediates \ classes \ debug(或发布)替换/bin/classes – GrafOrlov

    看起来这是在.h文件和.cpp文件中的函数不匹配。 您已经提到了在.h文件中的某些参数,这些参数在native.cpp文件中的实现中缺少。所有的

    +0

    嘿格尔登,我搜索我的参数,但中号无法找到。 Thanx for reply –